抽象类中抽象方法重写时访问权限不能缩小,只能扩大或保持不变,这是为满足里氏替换原则和保障多态安全;抽象方法修饰符仅限public、protected或默认,不可为private;子类重写时权限必须≥父类声明权限。
抽象类中的抽象方法在子类中重写时,访问权限只能扩大或保持不变,不能缩小——这是 Java 编译器强制执行的规则,核心是为了满足里氏替换原则和保障多态调用安全。
抽象类中声明的抽象方法,其访问修饰符只能是 public、protected 或默认(包私有),不能是 private。因为 private 方法不可被继承,自然也无法被重写。
子类实现抽象方法时,必须提供具体方法体,且访问权限必须 ≥ 父类抽象方法的权限。合法调整如下:
假设父类抽象方法是 public,子类却实现为 protected 或 private,那么通过父类引用调用该方法时就会失败——编译器只认父类声明的可见性,运行时却指向子类实现。这直接破坏了“子类对象能完全替代父类对象”的前提。
立即学习“Java免费学习笔记(深入)”;
例如:public abstract class Animal { public abstract void move(); } 若子类写成 private void move() { ... },编译器会报错:Cannot reduce the visibility。
抽象方法本身就不能是 static 或 final,所以不存在“重写 static 抽象方法”的情况。子类中出现同名 static 方法,属于隐藏(hiding),不是重写;final 方法则根本不可重写。