java中父类成员访问权限由修饰符决定:private完全不可见;default仅同包子类可访问;protected允许跨包子类访问和重写;public可被继承但重写时权限不可收缩;static/final方法不参与重写,@override用于校验重写正确性。

Java 中继承关系下父类成员的访问权限,本质是封装与可扩展性之间的平衡。子类能否访问、能否重写、能否对外暴露,全由父类成员的修饰符决定,且规则明确、编译期强制校验。
private 成员:完全不可见,不参与继承
父类的 private 成员(字段或方法)对子类彻底隐藏。子类既不能直接访问,也不能重写——哪怕声明同名方法,也只是定义了一个全新方法,和父类无关。这是因为 private 是“本类专属”,连子类都不在作用域内。若需让子类间接使用,父类应提供 public/protected 的访问方法。
default(包私有)成员:仅限同包子类访问
没有显式修饰符的成员,只对同一包内的类开放。子类若与父类不在同一个包,就无法访问这些成员,更谈不上重写。这种设计适合模块内部协作,避免跨模块误用。例如,工具类中默认修饰的辅助方法,只供同包下的子类调用,外部使用者只能走 public 接口。
protected 成员:子类友好型,跨包也可用
protected 是为继承量身定制的权限:同一包内所有类可访问;不同包的子类也能在自身方法中访问(但子类对象不能直接调用)。它允许子类复用和扩展父类逻辑,又防止无关类随意调用。注意:子类重写 protected 方法时,访问权限可升级为 public,但不能降级为 default 或 private。
public 成员:完全开放,重写时权限不可收缩
父类的 public 成员对所有人可见,子类自然可以继承并重写。但关键约束是:重写后的方法仍必须是 public。如果改成 protected 或更严格,编译器会报错 Cannot reduce the visibility。这是为了保障多态安全——外部代码通过父类引用调用时,实际执行子类方法,若权限变窄,运行时就会失败,所以 Java 把问题挡在编译阶段。
static 和 final 方法不参与重写,它们属于类或不可变契约,子类中同名方法属于隐藏(hiding)或编译错误。而 @Override 注解不是可选装饰,它是编译器的校验开关,能帮你提前发现拼写错误、签名不匹配等“假重写”问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











