重写方法的访问修饰符不能比父类更严格:public只能被public重写,protected可被protected或public重写,不可降为private或默认;default方法仅同包可重写;final、static、构造器不可重写;必须用@Override校验签名;返回类型须协变;检查异常只能缩小不能扩大。
重写方法的访问修饰符不能比父类更严格
子类重写父类方法时,public 方法只能被 public 重写,protected 可以被 protected 或 public 重写,但不能降为 private 或包私有(默认)。否则编译直接报错:Cannot reduce the visibility of the inherited method。
常见错误场景:父类用 protected 定义工具方法,子类误写成 private void doWork() —— 这不是重写,而是定义了一个新方法,父类调用仍走原逻辑,容易引发行为不一致。
- 父类
default(包级私有)方法,子类只能在同包中重写,且不能加private或protected -
final方法无法被重写,强行写同签名方法会变成编译错误,不是覆盖 - 构造器、静态方法(
static)不能被重写,它们属于类而非实例,子类里同名static方法只是隐藏(hiding)
@Override 注解不是可选的装饰,而是编译期校验开关
没加 @Override 不影响运行时重写行为,但它能帮你提前发现拼写错误、参数类型不匹配、返回值协变违规等问题。比如父类是 String getName(),子类写成 String getname()(小写 n),不加注解可能悄无声息地新增一个方法;加上后立刻报错:method does not override or implement a method from a supertype。
建议所有明确意图是重写的方法都强制加 @Override,尤其在使用 IDE 重构或继承深度较大时——它本质是告诉编译器:“我确认这个方法要覆盖父类,请帮我核对签名”。
立即学习“Java免费学习笔记(深入)”;