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
示例:
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 会编译失败。
一个接口可 extends 多个接口(类似类实现多个接口),也是逗号分隔:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
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 的调用仍指向实现类实例——这点在调试回调逻辑时经常引发意料之外的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










