我对受保护的标识符有一些疑问。在 K.Sierra 编写的 Sun Certified Java Programmer Study Guide 的第一章中,我发现了以下信息:
“一旦包外子类继承了受保护的成员,该成员(由子类继承)就成为子类外部任何代码的私有成员,子类的子类除外。”
我提供了反映上述陈述的示例代码,这对我来说是绝对清楚的。
// 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 http://docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.6.2):
A protected
对象的成员或构造函数可以从包的外部访问,在该包中,对象的成员或构造函数只能由负责实现该对象的代码声明。
它指定在包之外,只有子类可以访问受保护的成员。这implies您还可以访问包内的变量。虽然措辞很糟糕,但受保护的成员具有包级别的可见性仍然是事实也子类级别的可见性。
也可以看看:
- 这个相关问题 https://stackoverflow.com/questions/902922/why-does-the-protected-modifier-in-java-allow-access-to-other-classes-in-same?rq=1
- The 爪哇步道 http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html用于访问控制
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)