java跨包继承中,public成员可被任意包子类自由调用;protected允许跨包子类继承和调用super方法,但禁止通过父类实例访问;default成员仅限同包可见,跨包子类无法继承;private成员完全不可见,子类无法访问或继承。

跨包继承时,Java 四种访问修饰符的可见性边界非常明确,关键不是“能不能被子类看到”,而是“能不能通过实例或继承关系合法调用”——编译器在编译期就严格检查,不满足规则直接报错。
public:跨包无阻碍,子类可自由调用
public 成员在任何包中都可见,子类无论是否同包,都能直接继承并调用(包括通过 this 或父类实例引用)。
- 父类在
com.example.base.Service中声明public void execute() - 子类在
com.example.ext.CustomService中可重写、可调用super.execute(),也可通过new Parent().execute() - 无访问限制,但一旦发布,降级会破坏二进制兼容性
protected:子类可见,但不能通过父类实例跨包调用
protected 允许不同包的子类继承该成员,但禁止通过父类对象引用访问 —— 这是常被误解的核心边界。
- 父类
Base(包 A)中protected void init() - 子类
Child(包 B)能重写init(),也能在自身方法中调用super.init() - 但
Base b = new Base(); b.init();在包 B 中编译失败:提示 “has protected access” - Java 16+ 还额外限制:跨包子类无法调用父类
protected构造器,除非显式super()且位于同包
默认(包级私有):跨包即不可见,子类无法继承
没有修饰符的成员仅限同包访问,跨包时子类根本看不到它,更谈不上继承或重写。
- 父类
Utils(包 A)中void parseJson(String s) - 子类
JsonHandler(包 B)编译时完全无法识别该方法 - 即使两个类逻辑上应构成继承关系,跨包 + 默认权限 = 编译失败
- 若需包内协作又兼顾测试,default 是比 public 更安全的选择
private:彻底隔离,子类无法触及
private 成员对子类完全不可见,既不能继承,也不能访问,JVM 甚至不将其视为“可继承成员”。
- 父类中
private String token;和private void validate() {} - 子类中写
this.token或super.validate()均编译报错 - 内部类例外:父类的 private 成员可被其定义的 static/non-static 内部类直接访问
- 子类若想复用逻辑,必须依赖父类提供的 public/protected 方法间接调用











