子类重写父类方法时访问权限不能更严格,必须相同或更宽松;父类public→子类必须public,protected→可public/protected,default→同包内可default/protected/public,private不可重写;接口方法实现必须用public。

子类重写父类方法时,访问权限不能比父类更严格,只能保持相同或更宽松——这是Java编译器强制执行的规则,不是建议,而是硬性约束。
权限调整必须遵循“只增不减”原则
父类方法的访问修饰符决定了子类重写时的最低可见性门槛:
- 父类是 public → 子类重写必须是 public(用
protected、default或private会直接报错Cannot reduce the visibility) - 父类是 protected → 子类可用 protected 或 public(不能降为
default或private) - 父类是 default(包私有,无修饰符)→ 子类重写仅限同包内,且只能是 default、protected 或 public(不能是
private) - 父类是 private → 不可继承,也不可重写;子类中同名方法只是独立声明,与父类无关
为什么不允许降低权限?
核心是为了保障多态调用的安全性。例如:
- 代码写的是
Animal a = new Dog(); a.sound(); - 编译器只检查
Animal.sound()的声明权限 - 如果
Animal.sound()是public,而Dog.sound()被改成protected,外部调用就会在编译期失败 - Java 把问题拦在编译阶段,避免运行时静默失效或
IllegalAccessError
接口实现和抽象方法也要遵守同一规则
接口中所有方法默认是 public abstract,所以实现类中重写这些方法时:
- 必须显式写 public(哪怕父接口没写,也不能省略)
- 写成
protected或default会编译失败 - 抽象类中的抽象方法被子类实现时,同样不能收窄权限
@Override 注解不是装饰,是安全锁
它强制编译器校验重写是否真正成立:
- 捕获拼写错误(比如
toString()写成ToString()) - 发现参数类型或返回值不匹配
- 防止父类方法被删改后,子类方法变成“假重写”而逻辑失效
-
static和final方法加@Override会编译失败,因为它们不参与重写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











