抽象类支持多层继承中的分步实现,中间类必须声明为abstract才能只重写部分抽象方法;未实现的抽象方法保持抽象状态,由最终具体子类全部实现。

Java 中抽象类本身不支持“多继承”,但可以通过多层继承链(如 A → B → C)实现功能逐级细化。当需要在中间层只重写部分抽象方法、保留其余抽象方法待后续子类实现时,关键在于:中间层必须声明为 abstract 类。
中间类必须声明为抽象类
如果父抽象类定义了多个抽象方法,而你希望某个子类(比如 B)只实现其中一部分,同时把剩余抽象方法留给更下层的子类(比如 C)去完成,那么 B 就不能是具体类——它必须用 abstract 修饰。否则编译器会报错:“B 不是抽象类,却未实现所有抽象方法”。
- 抽象类可以只重写部分抽象方法,未重写的仍保持抽象状态
- 只要类中还存在未实现的抽象方法,该类就必须是 abstract
- 只有最末端的具体子类才需要实现全部抽象方法
典型三层结构示例
假设顶层抽象类定义两个行为:
abstract class Animal {
abstract void breathe(); // 所有动物都要呼吸
abstract void move(); // 移动方式各不相同
}
中间类陆生动物选择实现 breathe(),但把 move() 留给后代:
abstract class Terrestrial extends Animal {
@Override
void breathe() {
System.out.println("用肺呼吸");
}
// move() 不实现,保持抽象
}
最终具体类只需补全剩余抽象方法:
class Dog extends Terrestrial {
@Override
void move() {
System.out.println("四肢奔跑");
}
}
注意访问权限与 final 冲突
重写抽象方法时,子类方法的访问修饰符不能比父类更严格(例如父类是 public abstract,子类不能写 protected),且不能加 final 或 static ——因为抽象方法的设计本意就是被重写。
- 抽象方法天然要求可被覆盖,final 会阻止重写,二者矛盾
- static 方法属于类而非实例,无法参与多态,也不允许出现在抽象方法上
- private 抽象方法非法:子类根本不可见,无法重写
避免误用接口替代抽象类
如果只是想“强制某些方法被实现”,接口确实也能做到,但它不提供字段、构造器或非抽象方法。当你需要共享状态(如 name、age)、共用逻辑(如默认 eat() 实现)或构造流程时,抽象类仍是不可替代的。多层继承中的分步实现,正是抽象类的核心价值所在。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











