接口方法必须为public且非static、non-final;实现类重写时必须显式声明public,否则编译报错;多接口同名方法需签名一致,返回类型支持协变,异常需兼容;抽象类可不实现接口所有方法;建议强制使用@Override注解。
Java 接口中定义的方法默认是 public abstract,哪怕你不写修饰符。实现类里重写这些方法时,public 修饰符不能省略——否则编译报错:error: method does not override or implement a method from a supertype。这是因为子类方法的访问权限不能比父接口更严格。
private、protected 或包私有(默认)static 和 default 方法在接口中允许存在,但它们不参与“被实现”的逻辑;只有 abstract 方法才需要在实现类中提供具体体final 修饰重写的方法(除非该方法本身在接口中是 default 且你只是调用它)如果两个接口都声明了同名同参数的方法(比如都定义了 void start()),实现类只需提供一个实现即可,不会报错。但如果返回类型不同(如一个接口要求 String start(),另一个要求 int start()),编译器直接拒绝——因为 Java 不允许仅靠返回类型区分重载,更不允许这种协变冲突。
Object getValue() vs String getValue()),Java 允许协变返回,实现类可用子类型返回(String)throws IOException,另一个 throws SQLException),实现类方法不能同时满足两者,需统一处理或包装成运行时异常default 方法可以“自动合并”,其实冲突时仍需手动覆盖抽象类可以声明实现某个接口,但不必提供接口中所有 abstract 方法的具体实现——只要它自己也声明为 abstract。这点和普通类不同,普通类(非 abstract)必须实现接口全部抽象方法。
public abstract class BaseProcessor implements Runnable {
// 没有实现 run() 方法,合法
public void init() { /* ... */ }
}run()),要么最终给出 public void run() 实现default 方法的实现,子类仍可选择重写,不强制继承implements 和 extends:抽象类只能 extends 一个类,但可 implements 多个接口虽然 @Override 对编译不是必需的,但

void process(List items) 错写成 void process(ArrayList items) ,没加 @Override 可能变成新增方法而非重写,逻辑静默失效。
@Override
@Override 的实现类不会报错,但可能漏掉新契约@Override 也可用于实现 default 方法,同样起校验作用接口方法实现看着简单,真正踩坑多在权限修饰符、多继承冲突、抽象层级混用和注解缺失这几个点上。尤其当项目用到大量函数式接口或 Spring 的回调接口时,一个没写 public 或漏了 @Override,问题往往延迟到运行时才暴露。