java编译器强制非抽象类实现所有继承的抽象方法,否则报错;抽象方法是契约,要求子类必须重写;若子类不实现又不声明为abstract,将中断继承链上的契约传递。

因为 Java 编译器要求:非抽象类必须能被安全实例化,而抽象方法没有具体实现,若子类不重写,就无法调用该方法——这会破坏对象行为的完整性。
编译期强制保障可调用性
抽象方法只声明不实现,本质是定义一种契约:子类必须提供自己的版本。如果子类是普通类(非 abstract),却留着未实现的抽象方法,那代码一运行到该方法就会出错。Java 在编译阶段就拦截这种风险,直接报错:error: type X is not abstract and does not override abstract method Y()。
避免“假装能用”的隐患
对比普通父类里的默认实现:比如 makeSound() { System.out.println("未知声音"); },子类可能忘了重写,结果所有动物都叫“未知声音”。抽象方法不给默认实现,等于在编译时划一条红线:不写,过不了关;写了,才允许你 new 对象。
继承链上契约的逐层传递
抽象类不是终点,而是中间站。它把共性逻辑(如 eat、sleep)封装好,把差异点(如 makeSound、fly)标为 abstract,交由更具体的子类落实。如果子类跳过实现,又不声明为 abstract,就等于中断了这条契约链——下游更具体的类将无从得知自己该实现什么。
不实现的唯一合法出路:自己也变抽象
- 子类可以不实现部分或全部抽象方法,但必须加 abstract 修饰符
- 这样它就变成“契约中转站”,把未完成的方法继续传给它的子类
- 只要最终出现一个非抽象子类,就必须把整条链上所有抽象方法补全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











