java类只支持单继承以避免菱形问题和方法/字段二义性,接口可多实现因只定义行为契约、无状态、同名方法须由实现类统一重写。

Java 类只允许单继承,是因为要避免语义冲突和运行时歧义;而接口可以多实现,是因为接口不携带状态、不参与构造逻辑,只定义行为契约。
单继承防止方法与字段的二义性
如果一个类能同时继承两个父类,而这两个父类都定义了同名方法(比如 void start())或同名字段(比如 int version),编译器无法确定子类调用时该走哪个版本。这不是语法限制,而是语义层面的矛盾——“是一个 Vehicle”和“是一个 ElectronicDevice”在业务模型中可能根本无法共存。
- 编译阶段直接报错,例如 error: class X is already defined 或提示 Only one class can be extended
- IDE 通常会在 extends 后多写类名时高亮提醒
- 误把接口写成 extends InterfaceA, InterfaceB,实际应使用 implements
接口多实现不引发歧义的根本原因
接口只声明方法签名,不包含可变状态、构造器或非 final 字段。即使多个接口都定义了 void run(),实现类只需提供一份具体实现,所有调用都统一走这个版本。
- 若两个接口定义了同名但返回类型不同的方法(如一个返回 void,另一个返回 boolean),编译会失败——这是签名冲突,不是选择问题
- 接口间可以相互继承(interface SmartDevice extends Runnable, Serializable),叠加 default 方法也合法
- 实现类重写某个 default 方法,就覆盖所有来源的同签名行为
default 方法带来便利,但也需谨慎使用
Java 8 引入 default 方法,是为了让已有接口能安全演进(比如 Collection 新增 stream()),而不强制所有实现类立刻修改。但它不是为替代继承设计的。
- 多个接口的 default 方法若都尝试初始化日志器或连接池,可能重复执行或触发 NPE
- default 方法应在 this 完全构造前避免重操作,建议只做轻量委托
- 重逻辑仍应交给实现类自身或通过组合对象完成
抽象类和接口分工明确,不可互相替代
抽象类适合表达“是什么”,封装共享字段、模板方法、受保护工具逻辑;接口适合表达“能做什么”,支持正交能力组合。
- SmartDoor 实现 Lockable、AlarmTriggerable、RemoteControllable,各能力彼此独立
- OrderService 继承 BaseService(获得事务/日志基础),再实现 Retryable、Auditable 等接口
- 若多个类有大量相同字段和模板逻辑,说明它们本就该共有一个父类,而不是堆砌接口
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











