从另一个不同包的实例的子类调用protected方法

我想从提供此受保护方法的类的子类中调用另一个实例的受保护方法。 请参阅以下示例:

public class Nano { protected void computeSize() { } } public class NanoContainer extends Nano { protected ArrayList 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 

您可以通过子类化和覆盖来访问受保护的方法; 当它们在同一包装中可用时。 我会补充一些细节。 你可以在这里阅读细节 。

您拥有的示例位于java中Object类中可用的protected clone()方法的行上; 你不能直接在任何对象上调用它(尽管所有对象都隐式地从Object类扩展)。

不知道原理,但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所以它都很好。

现在,为什么一切都好,如果它们都是相同的包,但如果它们是不同的包呢? 理由是什么? 我不知道也想知道。

元评论我已经回滚了另一个用户最近的更新,因为它实质上改变了答案,可能更适合作为顶级答案本身。