java禁止子类重写时收窄方法访问权限,以保障多态调用安全和里氏替换原则;权限只能持平或放宽,且编译期强制检查并报错。

因为这会直接破坏多态调用的安全性,违反里氏替换原则(LSP)。Java 编译器在编译期就强制检查,一旦子类把方法权限改得更严格,立刻报错。
保障父类引用能正常调用子类方法
Java 允许用父类类型引用指向子类对象,比如 Animal a = new Dog();。此时调用 a.makeSound(),实际执行的是子类重写后的方法。但如果子类把原本 public 的方法改成 protected 或包私有,外部代码本可通过父类引用访问该方法,却因子类收窄权限而失败——编译器无法保证调用始终合法。
权限等级是单向递减的
Java 明确规定权限顺序为:public > protected > 默认(包私有) > private,且子类重写时只能持平或放宽:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 父类是 public → 子类必须是 public
- 父类是 protected → 子类可选 protected 或 public,不能是默认或 private
- 父类是默认(包私有)→ 子类可选默认、protected 或 public,不能是 private
- 父类是 private → 不可重写,子类中同名方法只是独立声明,与继承无关
接口实现和抽象方法同样适用
接口中所有方法默认 public,所以实现类中 @Override 的方法也必须是 public;抽象方法被子类实现时,也不能收窄权限。这些规则统一服务于同一个目标:确保任何符合父类契约的地方,子类都能无缝替代。
这不是运行时问题,而是编译期强制约束
错误提示非常明确:Cannot reduce the visibility of the inherited method from XXX。它精准定位到子类方法定义行。很多 IDE 自动生成的 @Override 方法默认加 public,手动删掉就容易踩坑。别依赖自动补全判断权限是否合法,要主动核对父类方法的实际修饰符。










