子类重写父类方法时访问权限不能更严格,必须遵循“可见性不降低”原则;private、static、final方法不可重写;@override用于编译期校验重写合法性。

重写方法的访问权限不能比父类更严格
子类重写父类方法时,访问修饰符必须满足“可见性不降低”的原则。也就是说,子类方法的访问权限只能等于或大于父类被重写方法的权限。
- public 方法只能被 public 重写(不能用 protected、default 或 private)
- protected 方法可被 protected 或 public 重写(不可降为 default 或 private)
- default(包私有)方法只能在 同包内的子类中重写,且重写方法不能是 private 或 protected,只能是 default 或 public
- private 方法不能被继承,因此 无法重写;子类中同名方法只是独立定义,与父类无关
为什么不能降低可见性?
这是为了保障多态调用的安全性和一致性。假设父类方法是 public,外部代码可通过父类引用调用它;若子类擅自将其改为 protected,运行时通过父类引用调用该方法就会失败——编译器提前禁止这种行为,避免逻辑断裂。
典型错误提示:Cannot reduce the visibility of the inherited method from Parent
static 和 final 方法不参与重写
这两类方法不具备运行时多态特性:
- static 方法属于类本身,子类中同名 static 方法是“隐藏(hiding)”,不是重写;调用取决于引用类型,而非实际对象类型
- final 方法明确禁止覆盖,子类若声明同签名方法,编译直接报错
务必使用 @Override 注解
@Override 不是装饰,而是编译期契约:
- 它强制编译器检查:该方法是否真能覆盖父类或接口中的某个可继承方法
- 拼写错误(如
toString()写成ToString())、参数类型不匹配、返回值不协变等,都会立刻暴露 - 若父类方法被删除或改名,未加 @Override 的“假重写”会悄然变成普通方法,引发隐蔽 bug











