跳转至

抽象类和接口的区别?类可以继承多个类么?接口可以继承多个接口么?

一、抽象类 vs 接口

维度 抽象类 接口
关系 is-a can-do
构造函数
成员变量 任意 public static final
方法 任意(抽象+具体) JDK8 前 public abstract,JDK8 后可有 default/static
继承数量 单继承 多实现
设计层次 上层模板 行为契约

二、抽象类

abstract class Animal {
    String name;
    abstract void speak();
    void breathe() { System.out.println("呼吸"); }
}
  • 不能实例化。
  • 可以有构造函数(给子类调用)。
  • 可以有成员变量、普通方法。

三、接口

interface Flyable {
    void fly();
}

interface Swimmable {
    default void swim() { System.out.println("游泳"); }
}
  • JDK8:可以有 default 方法、static 方法。
  • JDK9:可以有 private 方法。
  • 成员变量默认 public static final

四、类可以继承多个类吗

不能。Java 是单继承:

class A {}
class B {}
class C extends A, B {}   // 编译错误

目的:避免多继承的菱形冲突。

五、接口可以继承多个接口吗

可以

interface A {}
interface B {}
interface C extends A, B {}   // 可以

接口没有实现冲突问题(default 方法冲突时子类重写即可)。

六、怎么选

  • is-a 关系 + 有公共代码:抽象类。
  • can-do 行为契约 + 多实现:接口。
  • 8 种基本类型的包装类、Runnable/Callable 都用接口。

高频追问

  • Java 为什么类单继承?为了避免钻石问题。
  • 接口里的变量为什么是 final?因为接口不能有状态。