私は次の2つのファイルを持っています:
Fruit.java:
package superClass;
public class Fruit {
protected static void printName() {
System.out.println("My name is Khan");
}
}
Apple.java:
package food;
import superClass.*;
public class Apple {
public static void main(String[] args) {
int i, j;
for(i = 0; i < 5; i++) {
for(j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
printName(); // Call inherited member - NO ERROR, expected
Fruit f = new Fruit();
f.printName(); // Call instantiated member - ERROR, expected
}
}
予想どおり、Appleクラスから保護されたメソッドprintNameにアクセスすることはできません。これらは、異なるパッケージに存在するためです。次のエラーが発生します。
printName() has protected access in superClass.Fruit
完全に正しい。しかし、次のようにクラスsuperClassから継承した場合、エラーは発生しません。
package food;
import superClass.*;
public class Apple extends Fruit {
public static void main(String[] args) {
int i, j;
for(i = 0; i < 5; i++) {
for(j = 0; j < i; j++) {
System.out.print("*");
}
System.out.println();
}
printName(); // Call inherited member - NO ERROR, expected
Fruit f = new Fruit();
f.printName(); // Call instantiated member - NO ERROR, WHAT????
}
}
参照により、別のパッケージの別のクラスの保護されたメンバーにアクセスできるのはなぜですか?これは違法なアクセスだと思われますね。
私は混乱しています!誰か助けてください。
コードはJava1.6.0_18を使用してコンパイルされました。