Java接口必须用interface关键字定义,仅含隐式public static final常量和public abstract方法;类可implements多个接口,接口间用extends继承;Java 8起支持default和static方法,但同签名default冲突需显式重写。

接口定义必须用 interface 关键字,不能用 class
Java 中接口不是类,语法上完全独立:interface 声明后只能包含常量(隐式 public static final)和抽象方法(隐式 public abstract)。写成 class MyInterface 会直接编译报错:error: class, interface, or enum expected。
常见错误是把接口当成类来写构造器、字段或普通方法——接口里不允许这些。正确写法:
public interface Flyable {
int MAX_ALTITUDE = 10000; // 自动是 public static final
void takeOff(); // 自动是 public abstract
void land();
}一个类实现多个接口用 implements,逗号分隔
Java 不支持多继承(extends 多个类),但允许一个类同时实现多个接口,这是组合行为的标准方式。语法是 implements 接口A, 接口B, 接口C,注意没有 extends 或 implements 的嵌套结构。
- 所有接口中的抽象方法都必须在类中提供
public实现(访问修饰符不能更弱) - 如果两个接口有同名同签名方法(如都声明
void start()),实现一次即可,无需重复 - 若接口方法签名相同但返回类型不同(如一个返回
void,另一个返回String),则无法同时实现——编译器会报错:types com.example.A and com.example.B are incompatible
示例:
立即学习“Java免费学习笔记(深入)”;
public class Drone implements Flyable, CameraControl, Autonomous {
@Override
public void takeOff() { /* ... */ }
@Override
public void land() { /* ... */ }
@Override
public void capturePhoto() { /* ... */ }
@Override
public void navigate() { /* ... */ }
}接口之间可以继承,用 extends 而非 implements
接口不是类,但可以继承其他接口,复用方法契约。此时必须用 extends,写成 implements 会编译失败。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
一个接口可 extends 多个接口(类似类实现多个接口),也是逗号分隔:
public interface AdvancedFlyable extends Flyable, WeatherAware {
void autoPilot();
}这时实现 AdvancedFlyable 的类,不仅要实现 autoPilot(),还要实现 Flyable 和 WeatherAware 中的所有抽象方法。
注意:接口继承不涉及实现,也不触发默认方法的重写逻辑;只有类在实现时才会真正面对方法冲突问题。
默认方法(default)和静态方法让接口更灵活,但也带来冲突风险
从 Java 8 开始,接口可含 default 方法(有方法体)和 static 方法。它们不强制子类实现,但引入了潜在冲突:
- 若类实现的两个接口都提供了同签名的
default方法,编译器会报错:class Drone inherits unrelated defaults for capturePhoto() from types CameraControl and Recorder—— 必须在类中显式重写该方法 -
default方法不能访问实例字段(接口无字段),只能调用其他default或static方法 -
static方法属于接口本身,只能通过接口名调用(如Flyable.logStatus()),不可被实现类继承或重写
所以,加 default 是为了向后兼容,不是为了替代抽象类;过度依赖它会让实现类的契约变得模糊。
接口本身不保存状态,也不参与运行时对象创建。真正容易被忽略的是:当多个接口的 default 方法形成调用链(比如 A → B → C),而 C 又被重写时,父级 default 中对 this 的调用仍指向实现类实例——这点在调试回调逻辑时经常引发意料之外的行为。

















