我对保护标识符有一些疑问.在K.Sierra的Sun认证
Java程序员学习指南的第一章中,我发现了以下信息:
“一旦子类 – 包外继承受保护的成员,该成员(由子类继承)对子类外的任何代码都是私有的,除了子类的子类.”
我提供了反映上述陈述的示例代码,对我来说绝对清楚.
// Parent class package package1; import package2.Child; public class Parent { protected int i = 5; } // Child class package package2; import package1.Parent; public class Child extends Parent { // variable 'i' inherited } package package2; public class Neighbour { public void protectedTesting(){ Child child = new Child(); System.out.println(child.i); // no access } }
我已经开始尝试并进行了一些小改动 – 将Neighbor移到package1.并且可以访问“i”变量,这对我来说有点令人惊讶,因为它不符合语句“对子类之外的任何代码变为私有”
更改后的邻居类:
package package1; import package2.Child; public class Neighbour { public void protectedTesting(){ Child child = new Child(); System.out.println(child.i); // access! } }
请向我澄清一下.谢谢.
解决方法
简而言之,protected是包私有的,也是子类可见的.甚至JLS对此也是模糊的(
JLS §6.6.2):
A
protected
member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.
它指定在包外部,只有子类可以访问受保护的成员.这意味着您还可以访问包中的变量.它的措辞很差,但真正的是受保护的成员具有包级别可见性以及子类级别的可见性.
也可以看看:
> This related question
> Java Trail用于访问控制