访问控制 - 保护成员不受包外的影响

时间:2014-08-18 18:17:07

标签: java access-control

我在默认包中得到了类P4(我知道使用默认包是不好的做法,但仅仅是"例如"现在):

import temp.P2;

public class P4 extends P2 {

public void someMethod() {    
    P2 p2 = new P2();
//        p2.p2default();   // ERROR as expected
    p2.p2public();
    p2.p2protected();  // ERROR as not expected
}    

}
P2

中的

和类temp

package temp;

public class P2 {

protected void p2protected() {    
...
}    

public void p2public() {    
...
}    

void p2default() {    
...
}    

}

access control mechanism,我期待 P4 - 扩展P2,一旦导入该包的名称空间,即使从包外部也可以看到其超类的protected成员。

我缺少什么?

TIA。

3 个答案:

答案 0 :(得分:4)

问题可能是您没有尝试继承 p2protected()方法,您应该可以这样做,而是调用 {{ 1}}。即使您正在扩展该类,也不能在不同的对象上调用p2protected()方法。但是,protected应该有用。

答案 1 :(得分:2)

您定义的P2 p2 = new P2();类型P2 P4。如果p2类型为P4,则它可以访问它,因为它是P2的子类。

答案 2 :(得分:1)

来自JLS

  

对象的受保护成员或构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它

在您的代码中,您尝试访问另一个对象的受保护成员。

public void someMethod() {    
    P2 p2 = new P2();

    p2.p2protected();  // doesn't work, because someMethod and p2.p2protected
                       // operate on different objects (this vs. p2) 

    p2protected (); // works, because someMethod and p2protected operate
                    // on the same object (this)
}