




Java接口用interface定义,不能实例化,只声明方法签名(默认public abstract),字段为public static final;支持default和static方法;类实现接口必须覆盖所有抽象方法,且访问修饰符为public。
Java 接口不能被实例化,但可以被类实现(implements)或被其他接口继承(extends;定义接口用 interface 关键字,不是 class,也不是 abstract class。
接口是行为契约,只声明方法签名,不提供具体实现(默认方法和静态方法除外)。JDK 8+ 允许在接口中定义 default 和 static 方法,但普通抽象方法仍隐式为 public abstract,字段隐式为 public static final。
-able、Listener、Processor 等后缀表达能力或角色,如 Runnable、Comparable
public abstract——编译器自动添加,显式写出反而冗余int MAX_RETRY = 3; 合法,int x; 编译报错interface A extends B, C 是合法的,但类只能单实现多个接口:class X implements A, B, C
一旦类声明 implements 某个接口,就必须提供该接口中所有非 default 方法的具体实现,否则编译失败。若不想立即实现,类必须声明为 abstract。
public(不能是 protected 或包私有),因为接口方法默认是 public
Object,实现类可返回 String)
class X implements A, B { public void foo() { ... } }
default 方法用于向后兼容地扩展接口(比如 JDK 8 在 Collection 接口新增 stream()),而 static 方法则适合工具型逻辑,不依赖实例状态。
default 方法可以调用本接口其他 default 或 static 方法,但不能直接访问实现类的私有成员static 方法不能被子接口或实现类覆写,只能被隐藏(子接口定义同名 static 方法属于新声明,不是覆写)default 方法里写复杂业务逻辑——它本质是“兜底实现”,语义上仍是契约的一部分,不是替代抽象类的理由final 方法、synchronized 方法(语法允许但无意义)IDE 或 javac 报错时,多数源于对接口约束理解偏差。典型错误包括:
error: X is not abstract and does not override abstract method Y() in Z → 检查是否漏实现某个抽象方法,或方法签名拼写/参数类型不一致(如 List vs ArrayList)error: illegal combination of modifiers: public and abstract → 接口方法里写了 public abstract,删掉即可error: incompatible types: cannot convert from Object to String → 接口方法返回 Object,实现类返回了更具体的类型但没用协变语法(应确保返回类型是子类型,且方法签名一致)error: method does not override or implement a method from a supertype → 带 @Override 注解但父接口实际没有该方法(比如拼错名字,或误以为某默认方法是抽象的)接口的核心价值不在语法糖,而在解耦——调用方只依赖接口,不关心谁实现、怎么实现。容易被忽略的是:过度使用 default 方法会让接口边界模糊,逐渐退化成“带部分实现的抽象类”;真正需要共享状态或构造逻辑时,该用抽象类就别硬套接口。