public成员跨包可见,子类可直接调用;protected限自身继承链访问,禁止通过父类实例调用;默认修饰符跨包不可见,编译期强制隔离;private不参与继承,子类完全不可访问。

跨包继承时,Java 四种访问修饰符的可见性边界非常明确,关键不在“能不能继承”,而在于“子类能否访问父类成员”——这直接取决于修饰符本身的设计意图。
public:无边界,子类可直接调用
public 成员在任何包中都可见。子类无论是否与父类同包,都能通过 实例引用 或 super 访问父类的 public 字段和方法。
- 例如:包
com.a.Parent中有public void start(),包com.b.Child extends Parent可直接写this.start()或super.start() - 注意:public 构造器也能被跨包子类调用(需显式
super())
protected:同包 + 所有子类,但仅限“自身继承链”访问
protected 成员对子类开放,但有严格限制:子类只能访问 自己继承得到的 那部分,不能通过父类实例间接调用。
- 正确:在
com.b.Child中写super.doStep()(假设doStep()是Parent的 protected 方法) - 错误:在
Child中写parentInstance.doStep()—— 编译报错,即使parentInstance是Parent类型且是本类创建的 - Java 16+ 还额外限制:跨包子类无法调用父类的 protected 构造器,除非构造器声明在同一包内
默认(包级私有):跨包即断连,子类也无权访问
没有修饰符的成员只在声明它的包内有效。哪怕子类继承了父类,只要不在同一包,就完全看不到这些成员。
- 即便
Child继承自Parent,若两者分属不同包,Child无法访问Parent的默认方法或字段 - 这种不可见是编译期强制的,反射也无法绕过(运行时仍抛
IllegalAccessException) - 常见误判:以为“继承了就能用”,实际连编译都通不过
private:彻底隔离,继承不传递可见性
private 成员不会被继承,子类既不能访问,也不能重写。它只属于声明它的那个类的“内部契约”。
-
Child中写super.xxx或this.xxx都无法触达父类 private 成员 - 内部类例外:父类的 private 成员可被其定义的内部类(包括匿名、局部、嵌套)直接访问
- 子类若想复用逻辑,必须依赖父类提供的 public/protected 接口,而非绕过封装

















