抽象类和接口的区别?类可以继承多个类么?接口可以继承多个接口么?¶
一、抽象类 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 是单继承:
目的:避免多继承的菱形冲突。
五、接口可以继承多个接口吗¶
可以:
接口没有实现冲突问题(default 方法冲突时子类重写即可)。
六、怎么选¶
- is-a 关系 + 有公共代码:抽象类。
- can-do 行为契约 + 多实现:接口。
- 8 种基本类型的包装类、Runnable/Callable 都用接口。
高频追问
- Java 为什么类单继承?为了避免钻石问题。
- 接口里的变量为什么是 final?因为接口不能有状态。