保護された識別子に関していくつか疑問があります。K.SierraによるSunCertifiedJava Programmer Study Guideの最初の章で、次の情報を見つけました。
「パッケージ外のサブクラスが保護されたメンバーを継承すると、そのメンバー(サブクラスによって継承される)は、サブクラスのサブクラスを除いて、サブクラス外のすべてのコードに対してプライベートになります。」
上記のステートメントを反映したサンプルコードを提供しましたが、それは私には絶対に明らかです。
// Parent class
package package1;
import package2.Child;
public class Parent {
protected int i = 5;
}
// Child class
package package2;
import package1.Parent;
public class Child extends Parent {
// variable 'i' inherited
}
package package2;
public class Neighbour {
public void protectedTesting(){
Child child = new Child();
System.out.println(child.i); // no access
}
}
私は実験を開始し、小さな変更を加えました-Neighborをpackage1に移動しました。そして、「i」変数へのアクセスがあります。これは、 「サブクラス外のコードに対してプライベートになる」というステートメントに準拠していないため、私にとっては少し驚くべきことです。
変更後のネイバークラス:
package package1;
import package2.Child;
public class Neighbour {
public void protectedTesting(){
Child child = new Child();
System.out.println(child.i); // access!
}
}
はっきりさせてください。ありがとう。