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

时间:2013-01-18 17:23:18

标签: java subclass packages protected 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
        }
    }

}

javac告诉我computeSize() has protected access in Nano。我看不出这个的原因(我以为我已经在其他一些代码中这样做了)。我想保护这种方法,我该怎么办?

javac version "1.7.0_09"

修改

我想提供一个精简版本,但我没有想到这样的事实,即这些类位于不同的包中。

nanolay.Node
nanolay.NanoContainer
nanogui.SomeOtherNode

2 个答案:

答案 0 :(得分:12)

不知道理由,但JLS在6.6.2. Details on protected Access(强调我的)中证实了这一点:

  

对象的受保护成员或构造函数只能通过负责实现该对象的代码从中声明它的包之外的进行访问。

所以:

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,所以一切都很好。

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

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

答案 1 :(得分:7)

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

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