java允许子类在重写非private方法时提升访问权限,但禁止降低权限;继承的成员权限不可修改,private成员不参与继承,static/final方法不可重写。

Java 中子类不能“放宽”父类成员本身的访问修饰符,但可以在重写方法时提升其访问权限——这是唯一被允许的、方向明确的“放宽”操作。关键要分清两种情况:继承来的成员直接使用 vs 重写父类方法。
继承来的方法或字段,权限不能改
子类继承了父类的 public 或 protected 成员后,这些成员在子类中仍保持原有修饰符。你不能把父类里一个 protected void save() 在子类里“改成 public”来调用——它本来就是 protected,子类调用时权限没变,也不需要你手动改。
也就是说:继承 ≠ 可修改权限。子类只是获得了使用权限,不是获得了定义权限。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
只有重写方法时,才能合法提升访问级别
当你用 @Override 重写父类的一个非 private 方法时,Java 允许你把访问修饰符设得更开放(但绝不允许收窄)。规则如下:
- 父类是
public→ 子类重写必须是public(不可降级) - 父类是
protected→ 子类可用protected或public - 父类是
default(包私有)→ 子类重写只能在同包内,且可选default、protected或public - 父类是
private→ 不可重写(根本不可见)
例如:
父类:protected void process() { ... }
子类可安全重写为:@Override public void process() { ... }
为什么只允许“升”不许“降”?
这是为了保障多态安全。比如:Parent p = new Child(); p.process(); 这行代码依赖的是父类声明的可见性。如果子类把 process() 改成 private 或 default,编译器就无法保证这行调用始终有效——外部代码本可通过父类引用调用,却因子类限制而失败。所以 Java 在编译期就拦截:Cannot reduce the visibility。
其他常见误区提醒
- private 成员完全不参与继承:子类里写同名方法/字段,只是新声明,和父类无关
- default 成员只对同包子类可见:跨包子类既看不到,也不能重写
-
接口方法默认 public:实现类中重写也必须是
public,删掉会编译报错 - static / final 方法不能重写:它们不走动态绑定,谈不上权限调整
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










