たとえ子クラスからでもprotectedフィールドに無制限にアクセスできるわけではない
JLS2 6.6.2, 6.6.7 より。
package foo; public class ProtectedField { protected int i; }
package bar; import foo.ProtectedField; public class ProtectedFieldChild extends ProtectedField { int test(ProtectedFieldChild p) { // OK return p.i; } int test(ProtectedField p) { // コンパイルエラー。 // 親クラス型であるProtectedFieldを通じては // i にアクセスできない。 return p.i; } int test(ProtectedFieldGrandChild p) { // OK。ProtectedFieldGrandChild は // ProtectedFieldChild の子クラスだから。 return p.i; } int test(buz.ProtectedFieldGrandChild p) { // OK。たとえ別パッケージでも、 // 自身の子クラスならよい。 return p.i; } class Inner { int test(ProtectedFieldChild p) { // OK。Inner は ProtectedField の子クラスではないが、 // ProtectedField の子クラスの body の中だから。 return p.i; } int test(ProtectedField p) { // コンパイルエラー。 return p.i; } } } class ProtectedFieldGrandChild extends ProtectedFieldChild { }
package buz; public class ProtectedFieldGrandChild extends bar.ProtectedFieldChild { }