6

この保護されたメソッドを提供するクラスのサブクラス内から別のインスタンスの保護されたメソッドを呼び出したい。次の例を参照してください。

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
4

2 に答える 2

15

理論的根拠はわかりませんが、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()ためアクセス可能ですが、ではない可能性があるためアクセスできません。一方、持っているので、それはすべて良いです。thisP2other.foo()otherP2Abar2P2A

さて、それらがすべて同じパッケージであるが、異なるパッケージである場合、なぜすべてがOKなのですか?理論的根拠は何ですか?わからない、知りたい。

メタコメント回答が大幅に変更され、おそらくトップレベルの回答自体としてより適しているため、別のユーザーによる最近の更新をロールバックしました。

于 2013-01-18T18:11:14.667 に答える
8

サブクラス化とオーバーライドのいずれかによって、保護されたメソッドにアクセスできます。同じパッケージで入手できる場合も同様です。詳細を追加します。詳細はこちらでご覧いただけます。

あなたが持っている例はprotected clone()、JavaのObjectクラスで利用可能なメソッドの行にあります。どのオブジェクトでも直接呼び出すことはできません(ただし、すべてのオブジェクトは暗黙的にObjectクラスから拡張されます)。

于 2013-01-18T17:32:30.353 に答える