子类不能自动拥有父类所有权限,其可访问成员取决于父类修饰符与包关系:public任意包可访;protected跨包子类可在自身方法中访问;default仅同包可访;private永远不可直接访问。

子类**不会自动拥有父类的所有权限**,它能访问哪些成员,取决于两方面:父类成员的访问修饰符 + 子类与父类是否在同一个包中。不能笼统说“子类有没有父类的所有权限”,而要看具体是哪个成员、什么修饰符、什么调用场景。
看父类成员的修饰符类型
Java 中只有四种访问修饰符,它们决定了子类能否直接访问:
- public:子类无论是否同包,都能直接访问(方法、属性、嵌套类均可)
-
protected:子类无论是否同包,在子类自身定义内部可直接访问;但不能通过父类对象引用访问(例如
fuObj.protectedMethod()在不同包子类中编译报错) - 默认(包级私有):仅当子类与父类在同一包内时可访问;跨包子类完全不可见
- private:子类永远不可直接访问,哪怕同包也不行;只能通过父类提供的 public/protected 方法间接操作
看子类是否在同一个包中
这是影响 protected 和 默认修饰符的关键分水岭:
- 同包子类:可访问父类的
public、protected、默认成员 - 跨包子类:只能访问
public和protected成员(注意:protected仅限在子类代码体内调用,不能通过父类实例调用) - private 成员对任何子类都不可见 —— 这不是权限“不够”,而是语言设计上就禁止直接触及
验证子类实际能访问什么
最可靠的方式是写两个类测试:
立即学习“Java免费学习笔记(深入)”;
- 建父类
Fu,定义public、protected、default、private各一个字段和方法 - 建同包子类
ZiSame,尝试在方法里直接访问四者 → 会发现default和protected都能访问 - 建跨包子类
ZiDiff(记得import父类),同样尝试访问 → 编译器会报错:无法访问default成员,private成员,但protected字段/方法在子类方法体内可用
注意:继承 ≠ 可见性
子类对象创建时,父类的 private 和默认成员仍会分配内存(供父类自己的方法使用),但子类代码中既不能读写,也不能继承为自己的成员。所以“具有权限”不等于“存在内存中”,更不等于“能被子类代码调用”。判断依据始终是:能不能在子类源码里合法写出那行访问语句。


















