接口方法必须为public,因为其默认即public abstract,实现类重写时不可降低访问权限,否则违反里氏替换原则且编译报错;而抽象类的抽象方法可为protected或包私有。

因为接口方法的默认访问权限就是 public,而 Java 的重写规则要求子类(或实现类)不能收窄父类(或接口)方法的访问权限。
接口方法天然公开
接口的设计目标是定义对外的契约,所有方法都必须能被任意实现类、调用方访问。Java 规定:即使不写 public,接口中的方法也自动具有 public abstract 语义。比如:
-
void doWork();等价于public abstract void doWork(); - 这个
public不是可选的修饰,而是语言层面的强制约定
重写必须遵守权限守恒原则
子类实现接口方法时,本质上是在“重写”一个公开契约。如果实现类把方法写成 protected、包私有(不加修饰符)或 private,就会导致:
- 通过接口引用调用该方法时,JVM 找不到可访问的实现(编译直接报错)
- 破坏里氏替换原则:接口变量本应能无缝指向任意实现类,但权限变窄后调用失败
- 例如:
MyInterface obj = new MyClass(); obj.doWork();—— 若doWork()在MyClass中不是public,这行代码无法编译
public 是唯一合法选项
由于 public 是 Java 中最宽泛的访问级别,而接口方法起点已是 public,实现类只能保持或放宽——但已无更宽级别可选,所以必须显式或隐式使用 public:
- 写
public void doWork() { ... }✅ 合法 - 只写
void doWork() { ... }❌ 编译错误(降级为包私有) - 写
protected void doWork() { ... }❌ 编译错误(权限更严格)
和抽象类的关键区别
这点容易混淆:抽象类里的抽象方法可以是 protected 或包私有,子类实现时只需不低于该权限;但接口没有这种灵活性——它的全部方法从设计之初就面向“跨包、跨模块”的公开调用,所以一律强制 public。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











