java接口必须用interface关键字定义,所有方法默认public abstract、字段默认public static final;实现类需用implements并覆盖全部抽象方法,接口间继承用extends而非implements。

Java接口定义必须用interface,不能用class或abstract class
Java里接口是契约,不是实现。写成class MyInterface会直接编译报错:error: class, interface, or enum expected。接口声明必须以interface开头,且默认所有方法都是public abstract,字段都是public static final——哪怕你省略这些修饰符,编译器也会自动补上。
常见错误:在接口里写方法体(比如加{ return 0; }),或者加private方法(Java 9+才支持private接口方法,但必须带实现体,且仅用于辅助其他默认方法)。普通接口方法没实现体,写了就报error: missing method body, or declare abstract。
- 接口名首字母大写,符合
PascalCase惯例,比如Runnable、List - 接口里不能有构造器、实例字段、非静态代码块
- 从Java 8起可加
default方法(要有方法体)和static方法(也必须有方法体)
类实现接口必须用implements,且要覆盖全部抽象方法
implements是关键字,不是修饰符,必须写在class声明后、继承extends之后(如果同时存在)。比如class A extends B implements C, D——顺序不能颠倒,写成implements C extends B会编译失败。
一旦声明implements X,就必须提供接口中所有abstract方法的具体实现,否则类得声明为abstract。否则报错:error: class X must either be declared abstract or implement abstract method Y() in Z。
- 方法签名必须严格一致:名字、参数类型、返回类型(协变返回类型除外)、不抛出新受检异常
- 实现类里的方法访问权限只能是
public(接口方法默认就是public,子类不能降级) - 可以同时
implements多个接口,用逗号分隔;但只能extends一个类
接口之间用extends继承,不是implements
接口不能implements另一个接口,那是类干的事。接口想复用别的接口,得用extends,比如interface Sub extends Super。这表示Sub继承了Super的所有抽象方法,实现Sub的类也得一并实现Super里的方法。
一个接口可以extends多个接口,比如interface A extends B, C。这时A合并了B和C的所有契约。但注意:如果B和C里有同名同参方法但返回类型不同,就会编译失败,因为无法统一契约。
-
extends只用于类继承类、接口继承接口;implements只用于类实现接口 - 接口继承不会触发任何初始化行为,纯编译期契约叠加
- 不要为了“复用代码”让接口继承另一个接口——接口不包含可执行逻辑(
default方法除外)
接口变量声明和多态调用时,实际对象必须已实现该接口
写List<string> list = new ArrayList();</string>能成立,是因为ArrayList声明了implements List。但如果某类没写implements,哪怕它恰好有相同方法签名,也不能赋值给该接口变量——Java只认显式契约,不认“鸭子类型”。
运行时若强转失败,比如(List) obj而obj实际类型没实现List,会抛ClassCastException。这种错误编译期不报,全靠设计阶段确保implements关系正确。
- 接口变量本身不能
new,比如new List()非法;必须指向某个具体实现类的实例 - 判断是否实现某接口,用
obj instanceof MyInterface,不是看有没有同名方法 - Spring等框架常通过接口注入,如果实现类漏了
implements,运行时就找不到Bean
implements,或多写一个public在接口方法上,都可能让编译器立刻打断你。真正容易被忽略的,是接口方法默认的public abstract隐含性:它不写出来,但规则一点没少。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











