从不同的包的另一个实例的子类调用保护方法(Call protected method from a

2019-07-18 10:30发布

我想从这个类提供这种保护方法的一个子类中调用另一个实例的保护方法。 请看下面的例子:

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

Answer 1:

您可以访问受保护的方法可以通过继承和压倒一切的; 同样,当他们在同一个封装。 我会加一些细节。 你可以阅读细节在这里。

你有这个例子是对的线路protected clone()在Java中的Object类可用的方法; 你不能直接调用它的任何对象(尽管所有的对象隐式地从Object类扩展)。



Answer 2:

不知道理由,但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是负责执行P2other.foo()是无法访问的,因为other可能不是一个P2Abar2 ,另一方面有P2A所以它是所有好的。

现在,为什么一切都OK,如果他们都是相同的软件包,但如果他们是不同的包? 什么道理呢? 我不知道,想知道。

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



文章来源: Call protected method from a subclass of another instance of different packages