必须修改子类方法访问修饰符为与父类相同或更宽松级别,因java编译器强制要求重写方法不能降低可见性,否则违反里氏替换原则导致多态调用失败。

直接把子类方法的访问修饰符改成和父类一样,或者更宽松的级别,就能解决。
为什么必须改权限
Java 编译器强制要求:子类重写方法时,访问权限不能比父类更严格。这是因为多态调用依赖父类引用指向子类对象(比如 Animal a = new Dog();),如果子类把 public 方法改成 protected 或默认权限,外部代码通过父类引用就无法调用该方法,破坏了里氏替换原则,编译器会立刻报错:Cannot reduce the visibility。
怎么改才对
对照父类方法的访问修饰符,按以下规则调整子类方法:
- 父类是 public → 子类必须用 public
- 父类是 protected → 子类可用 protected 或 public,不能用默认或 private
- 父类是默认(无修饰符)→ 子类可用默认、protected 或 public,不能用 private
- 父类是 private → 不可重写,子类中同名方法只是独立声明,与继承无关
接口实现也要注意
接口里的方法默认是 public abstract,所以实现类中重写这些方法时,必须显式写 public。哪怕父接口没写 public,你也不能省略——不加或写成 protected / 默认都会编译失败。
快速排查和修复步骤
遇到 “正在尝试分配更低的访问权限” 报错时:
- 定位错误行,看子类方法当前用了什么修饰符
- 查父类或接口中对应方法的修饰符
- 把子类方法的修饰符改成等于或更宽的级别(通常直接加 public 最稳妥)
- 确认用了 @Override 注解,帮助编译器提前发现签名或权限问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











