0

私の理解によると、保護されたメソッドは同じパッケージ内の任意のクラスからアクセスできますが、このクラスのサブクラスのみが他のパッケージからアクセスできます。

package Parent;

public class Parent {
    protected void display() {
    //Code here
    }

}
import Parent;

package Child;

class Child extends Parent{
    void view(Parent p1) {
        this.display(); // Success
        p1.display();  // Error
    }

    void next(Parent p2) { 
        p2.foo(); //Success
    }
}   

this.display()子クラスが実装を担当するため、ここでは成功しています。しかし、クラスの一部ではないため、p1.display()機能しません。同じパッケージ内のクラスから保護されたメソッドにアクセスする場合、この動作をどのように正当化できますか?p1Child

4

3 に答える 3

2

君の

p1.display();

Parent受け取った正確なサブクラスに応じて、任意のパッケージに実装されたメソッドを実行する可能性があります。protectedこれは、拡張用に設計されたクラスがカプセル化されたメソッドをその子に提供できるようにするという の背後にある意図に明らかに違反しています。

その呼び出しが許可された場合、不正なクラスが、完全に外部のクラスからカプセル化されたメソッドにアクセスすることは自明のことです。

于 2013-06-05T09:56:43.847 に答える
1

使えば効きますsuper.display()。その理由はprotected、親のメソッドは、同じパッケージ内にあるかどうかにかかわらず、常に子クラスに表示されるためです。p1.display()両方のクラスが異なるパッケージにあるため、メソッドがパブリックであることが期待されると言うだけです。

この点について理解を深めるために、以下をお読みください。

Java では、デフォルト、パブリック、プロテクト、およびプライベートの違い

于 2013-06-05T10:00:53.943 に答える
1

Parentあなたが提供した例は、子に渡されたのインスタンスを使用してメソッドを呼び出しています。仕様では、スコープが保護されている場合、フィールドまたはインスタンス メソッドへのアクセスはサブクラスからでなければならないと述べています。と述べている仕様の部分に注意してくださいaccess is permitted if and only if the type of the expression Q is S or a subclass of S。あなたの例では、 ExpressionName は のインスタンスである p1 でありParent、そのタイプを notChildまたはのサブクラスにChildするため、アクセスは許可されません。

保護されたメンバーが宣言されているクラスを C とします。アクセスは、C のサブクラス S の本体内でのみ許可されます。

さらに、Id がインスタンス フィールドまたはインスタンス メソッドを表す場合、次のようになります。

アクセスが修飾名 Q.Id による場合 (Q は ExpressionName)、式 Q の型が S または S のサブクラスである場合にのみアクセスが許可されます。

フィールド アクセス式 E.Id (E はプライマリ式) によるアクセス、またはメソッド呼び出し式 E.Id(. . .) (E はプライマリ式) によるアクセスである場合、アクセスは次の場合にのみ許可されます。 E の型が S または S のサブクラスである場合。

ChildのサブクラスであるためParent、 のインスタンスをメソッドに渡すParentChild、その保護されたメソッドを呼び出すことができるはずです。仕様の規則はこれを禁止しています。

仕様

于 2013-06-05T10:01:11.633 に答える