Nik*_*s R 4 java packages protected subclass access-modifiers
我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法.请参阅以下示例:
public class Nano {
protected void computeSize() {
}
}
public class NanoContainer extends Nano {
protected ArrayList<Nano> children;
}
public class SomeOtherNode extends NanoContainer {
// {Nano} Overrides
protected void computeSize() {
for (Nano child: children) {
child.computeSize(); // << computeSize() has protected access in nanolay.Nano
}
}
}
Run Code Online (Sandbox Code Playgroud)
javac告诉我computeSize() has protected access in Nano.我看不出这个的原因(我以为我已经在其他一些代码中这样做了).我想保护这种方法,我该怎么办?
javac version "1.7.0_09"
Run Code Online (Sandbox Code Playgroud)
我想提供一个精简版本,但我没有想到这样的事实,即这些类位于不同的包中.
nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
Run Code Online (Sandbox Code Playgroud)
Mis*_*ble 12
不知道原理,但JLS在6.6.2中证实了这一点.受保护访问的详细信息(强调我的):
受保护的成员或对象的构造函数可以从包外部访问,只能通过负责实现该对象的代码来声明它.
所以:
package P2;
public class P2 {
protected void foo() {}
}
.........
package P2A;
class P2A extends P2.P2 {
void bar(P2.P2 other) {
this.foo(); // OK
other.foo(); // ERROR
}
void bar2(P2A other) {
other.foo(); //OK
}
}
Run Code Online (Sandbox Code Playgroud)
在P2A.bar一个调用this.foo()是可访问的,因为this负责执行P2但other.foo()不可访问,因为other可能不是一个P2A.bar2另一方面有一个P2A所以它是好的.
现在,为什么一切都好,如果它们都是相同的包,但如果它们是不同的包呢?理由是什么?我不知道也想知道.
元评论我已经回滚了另一个用户的最新更新,因为它实质上改变了答案,可能更适合作为顶级答案本身.
| 归档时间: |
|
| 查看次数: |
31099 次 |
| 最近记录: |