Java 中“子类覆盖父类方法时,权限必须大于等于父类”是基于多态性和面向对象“替换原则”的规定。其核心目的是为了确保当父类引用实际指向子类对象时,原本父类允许调用的代码不会被子类限制的权限堵死,保证程序稳定性。
权限由高到低:public > protected > default (包权限) > private。
1. 为什么必须大于等于?
- 多态要求:Java 允许使用父类引用指向子类对象(例如:Animal a = new Dog();)。
- 一致性:如果外部程序(如另一个包)可以调用 Animal 的 eat()(声明为 public),那么它也应该能调用 Dog 实例的 eat()。
- 违规后果:如果子类 Dog 的 eat() 降低为 private,外部代码依然按照 Animal 的类型使用,就会导致“编译通过但运行由于权限不足而崩溃”。
2. 具体场景举例
正确场景(满足要求):
- 父类方法:protected void method() {}
- 子类方法:public void method() {} (public > protected,允许)
错误场景(编译失败):
- 父类方法:protected void method() {}
- 子类方法:void method() {} (default < protected,编译器报错)
3. 补充说明
- Private 限制:父类中的 private 方法无法被重写,因为子类根本看不到该方法。
- 编译报错:如果子类试图将重写方法声明为更严格的权限,Java 编译器直接报错,无法通过编译。
总结:此规则保证了子类在替换父类时,绝不会“缩减”父类向外部暴露的能力。