我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法。请参阅以下示例:
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
}
}
}
javac
告诉我computeSize() has protected access in Nano
。我看不出这样做的原因(我以为我已经在其他代码中这样做了)。我想继续保护此方法,我该怎么办?
javac version "1.7.0_09"
我想提供一个精简版本,但我没有考虑到这些类位于不同的包中的事实。
nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode
不知道原理,但 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
}
}
在
P2A.bar
中,可以访问对 this.foo()
的调用,因为 this
负责实现 P2
,但other.foo()
不可访问,因为 other
可能不是 P2A
。另一方面,bar2
有一个P2A
,所以一切都很好。
现在,为什么如果它们都是相同的包就一切正常,但如果它们是不同的包则不行?理由是什么?我不知道也很想知道。
您可以通过子类化和重写来访问受保护的方法;当它们在同一包中可用时也是如此。我会添加一些细节。 您可以在这里阅读详细信息。
您拥有的示例位于 java 中 Object 类中可用的
protected clone()
方法行;您不能直接在任何对象上调用它(尽管所有对象都隐式地从 Object 类扩展)。