我在默认包中得到了类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。
答案 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)
}