Bar*_*ler 6 java inheritance scjp protected
我对保护标识符有一些疑问.在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
}
}
Run Code Online (Sandbox Code Playgroud)
我已经开始尝试并进行了一些小改动 - 将Neighbor移到package1.并且可以访问"i"变量,这对我来说有点令人惊讶,因为它不符合语句"对子类之外的任何代码变为私有"
更改后的邻居类:
package package1;
import package2.Child;
public class Neighbour {
public void protectedTesting(){
Child child = new Child();
System.out.println(child.i); // access!
}
}
Run Code Online (Sandbox Code Playgroud)
请向我澄清一下.谢谢.
简而言之,protected是包私有以及子类可见.甚至JLS对此也含糊不清(JLS§6.6.2):
甲
protected对象的成员或构造可以从它仅由代码中声明的封装,它负责该对象的执行外部访问.
它指定在包外部,只有子类可以访问受保护的成员.这意味着您还可以访问包中的变量.它的措辞很差,但真正的是受保护的成员具有包级别可见性以及子类级别的可见性.
也可以看看:
| 归档时间: |
|
| 查看次数: |
4858 次 |
| 最近记录: |