子类重写父类方法时访问权限只能持平或扩大,不可缩小;合法扩充包括:public→public,protected→public,包私有→protected或public;private方法不可重写。

子类重写父类方法时,访问权限可以扩大(或保持不变),但绝不能缩小——这是 Java 编译器强制执行的规则,核心目的是保障多态调用安全和里氏替换原则。
哪些扩充是合法的
扩充必须符合可见性层级:private
- 父类是 protected → 子类可改为 public
- 父类是 默认(无修饰符,包私有) → 子类可改为 protected 或 public
- 父类是 public → 子类只能保持 public(无法再扩大)
为什么 private 方法不能被重写
private 方法不参与继承,子类中定义同名同签名方法,只是独立声明,不是重写。它既不触发多态,也不受访问权限规则约束——因为父类的 private 方法对子类不可见,根本不存在“重写契约”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
扩充权限的实际效果
权限扩大不会让父类引用“意外看到”新方法,而是确保多态调用不中断:
- 若父类方法是 protected,外部代码本就不能通过父类引用直接调用;子类升为 public 后,仍需通过子类引用才能直接访问
- 但关键在于:当用 父类引用指向子类对象(如
Animal a = new Dog();)并调用该方法时,编译器只检查父类声明的权限——只要子类没收窄,运行时就能顺利执行重写版本
常见错误与规避
以下写法会直接编译失败:
- 父类 public void run() → 子类写成 protected void run()(报错:Cannot reduce the visibility)
- 父类 protected void init() → 子类写成 void init()(即包私有,同样报错)
- 误以为字段也能“重写并扩权”——字段只能隐藏,不参与多态;要控制可见性,应封装在 getter/setter 中,并重写这些方法来放宽权限
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










