0

クラス内の保護されたメンバーの動作を理解しようとしています。TopClassprotected integer を含むクラスがありますpr

クラス:

package com.test;

import com.test.anotherpackage.SubClass1;
import com.test.anotherpackage.SubClass2;
import com.test.anotherpackage.SubClass3;

public class TopClass {
    protected int pr;

    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 3;
        s1.pr = 0;
        s2.pr = 1;
        s3.pr = 1;
    }
}

com.test.anotherpackageと の3 つのクラスを持つSubClass1別のパッケージがありSubClass2ますSubClass3。継承階層は次のとおりです。

  1. SubClass1 extends TopClass
  2. SubClass2 extends SubClass1
  3. SubClass3 extends SubClass2

サブクラス1

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass1 extends TopClass {

    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; // Error because not in same package.
        s1.pr = 0; //(1)
        s2.pr = 1; // Does not throw an Exception. Why? (2)
        s3.pr = 1; // (3)
    }
}

サブクラス2

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass2 extends SubClass1 {
    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; // Error because not in same package.
        s1.pr = 0; // Throws Exception, why?  (4)
        s2.pr = 1; //  (5)
        s3.pr = 1; // Does not throw an Exception. Why?(6)
    }
}

サブクラス3

package com.test.anotherpackage;

import com.test.TopClass;

public class SubClass3 extends SubClass2 {
    void action(TopClass t, SubClass1 s1, SubClass2 s2, SubClass3 s3) {
        t.pr = 0; 
        s1.pr = 0; // Not Visible (7)
        s2.pr = 1; // Not Visible (8)
        s3.pr = 1; // (9)
    }
}

上記のコードで(1)は、(2)(3)(5)(6)および(9)が完全に機能し、可視性の問題はありません。しかし(4)、、、可視性の問題があります(7)(8)

JLS§6.6.2.1によると、

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

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

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

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

ここで理解しようとしているのは、なぜif the type of the expression Q is S or a subclass of S絵になるのかということです。この実装が有益な特定のシナリオはありますか? 関連する例は高く評価されます。SOで調べてみましたが、疑問を解決できる説明が見つかりませんでした。

4

1 に答える 1

0

議論している式は、コード内の質問の責任者でもあります。

if the type of the expression Q is S or a subclass of S

(2)式の型がs2のサブクラスであるSubClass1
(4)ため 式の型が のs1サブクラスではないため 式の型が のサブクラスであるSubClass2
(5)ためs3SubClass2

しかし、私は知りません

この実装が有益な特定のシナリオ

また。

于 2013-07-07T21:52:49.573 に答える