java接口支持多继承(extends多个接口),类仅支持单继承;接口方法默认public abstract,字段public static final;java 8+支持default方法,但同签名时实现类必须显式重写,否则编译失败。

Java接口本身支持多继承,但类不支持
Java里类只能单继承,这是语言设计决定的;但接口可以同时 extends 多个接口,这才是真正的“多继承”能力。很多人误以为要靠类去实现多继承,其实该用接口组合来达成目标。
常见错误现象:class A extends B, C 编译报错 error: class A is not allowed to extend multiple classes —— 这不是bug,是语法禁止。
- 接口之间用
extends继承多个父接口,例如:interface D extends A, B, C - 一个类实现多个接口,用
implements,例如:class X implements A, B, C - 接口中的方法默认是
public abstract,无需显式声明;字段默认是public static final - Java 8+ 接口可含
default方法,但若两个接口提供同签名的default方法,实现类必须重写该方法,否则编译失败
当多个接口有同名 default 方法时必须显式覆盖
这是最容易踩坑的地方:看似只是“实现多个接口”,结果编译不过,报错类似 classes A and B both define method foo(), which is not directly implemented by class C。
原因在于 Java 不允许歧义——即使两个 default 方法逻辑一致,也不能自动选其一。
立即学习“Java免费学习笔记(深入)”;
- 解决方式只有在实现类中显式写出该方法体,哪怕只是调用其中一个接口的实现:
@Override public void foo() { A.super.foo(); } - 不能只写空方法体(如
{}),除非你真不需要逻辑 - 如果某接口的
default方法依赖了其自身其他default方法,而该接口未被实现类直接implements,那这个链式调用会失效
接口多继承 vs 抽象类组合:什么场景该选谁
不是所有“需要多个行为”的情况都该堆接口。关键看语义是否为“能做什么”,而不是“是什么”。
- 用接口多继承:描述能力组合,比如
Runnable+Serializable+AutoCloseable,一个类可以同时具备运行、序列化、自动关闭能力 - 用抽象类:当需要共享状态或非公开实现逻辑,比如模板方法模式中,父类定义流程骨架,子类只填空步骤
- 性能上无差异,但过度使用接口继承链(如 A → B → C → D)会让实现类被迫承担大量无关契约,增加维护成本
- IDE 通常不会自动补全跨多层接口的
default方法冲突处理,得手动干预
接口继承中常被忽略的静态方法与私有方法限制
Java 8+ 允许接口定义 static 方法,但它不可被继承,更不可被重写;Java 9+ 支持 private 方法,仅用于辅助 default 或 static 方法,也不能被子接口访问。
-
static方法属于接口本身,调用必须用接口名:A.staticMethod(),不能用实现类名或实例调用 - 子接口即使
extends A,也不能通过B.staticMethod()访问 A 的静态方法(除非 B 自己也定义了同名静态方法) - 接口中
private方法不能被子接口看到,所以无法形成“私有工具方法复用链”,每个接口得自己定义 - 这点和类的继承完全不同,容易下意识当成普通继承来理解






