Java继承中方法重写必须保持或扩大访问权限,禁止缩小可见性:父类public方法子类重写必须为public,protected可升为public或保持protected,default仅限同包且只能为default或public,private不可重写;继承成员的访问级别不可修改。

Java 中继承关系里并不存在“可见性缩小原则”,相反,它严格遵循可见性只增不减的规则——子类重写父类方法时,访问权限不能比父类更严格,只能保持原样或扩大。
重写方法的权限必须放宽或持平
这是编译器强制执行的约束,目的是保障多态调用的安全性和里氏替换原则。一旦父类声明了某方法可被某范围访问,子类就不能让它变得更难访问。
- 父类是 public → 子类重写必须是 public(降为 protected/default/private 会报错:Cannot reduce the visibility)
- 父类是 protected → 子类可用 protected 或 public
- 父类是 default(无修饰符)→ 子类重写仅限同包内,且只能是 default 或 public
- 父类是 private → 不可继承,自然不可重写(子类中同名方法只是新声明,与父类无关)
继承来的成员,权限本身不可修改
子类继承 public/protected/default 成员后,这些成员在子类中的访问级别完全保留,不会自动升级或降级。
- 父类中 protected void save(),子类调用它仍是 protected 级别,不是 public
- 子类不能给继承来的方法“加 private”或“去 public”,那是非法操作
- 想限制使用?应通过设计逻辑控制(如抛异常、返回空),而非篡改访问修饰符
真正要“收紧”的,是设计起点,不是重写行为
所谓“按需收紧”,是指定义父类成员时从最严开始,再根据实际需要逐步放开——这不是在继承中收缩,而是在源头控制暴露程度。
- 字段和内部辅助方法,默认用 private(不参与继承,彻底封装)
- 需要子类扩展逻辑(如模板方法里的钩子),才设为 protected
- 对外提供稳定能力(API 入口、核心业务方法),才设为 public
- 模块内协作但不对外暴露,用 default(同包可见,跨包子类也访问不到)
常见误解澄清
有人误以为“子类可以缩小权限来加强封装”,这在 Java 中行不通。例如:
- 父类 public String getName(),子类写成 protected String getName() → 编译失败
- 父类 protected void init(),子类在不同包中试图调用 new Parent().init() → 不允许(protected 不允许跨包直接操作父类实例)
- 子类重写 protected 方法时,声明为 public 是合法且推荐的——只要语义不变,开放性提升不影响契约
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











