クラス内の保護されたメンバーの動作を理解しようとしています。TopClass
protected 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
。継承階層は次のとおりです。
SubClass1 extends TopClass
SubClass2 extends SubClass1
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で調べてみましたが、疑問を解決できる説明が見つかりませんでした。