一、抽象类
abstract class Shape {
abstract double area(); // 抽象方法,无实现
void desc() { System.out.println("图形"); } // 可含具体方法
}
不能实例化,子类必须实现所有抽象方法(除非子类也是抽象类)。用于”有部分公共实现 + 留扩展点”。
二、接口
interface Flyable {
void fly();
default void info() { System.out.println("会飞"); } // 默认方法
static void ver() { System.out.println("v1"); } // 静态方法
}
接口是纯契约,Java 8 后可有 default/static 方法。一个类可实现多个接口(多继承的替代)。
三、接口 vs 抽象类
| 维度 | 抽象类 | 接口 |
|---|---|---|
| 关系 | is-a,单继承 | can-do,多实现 |
| 成员 | 可有字段/具体方法 | 常量 + 抽象/默认/静态方法 |
| 用途 | 代码复用、模板 | 定义能力契约 |
经验:要复用代码用抽象类;要定义能力、解耦用接口。