У меня есть следующие два файла:
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
}
}
Как и ожидалось, у меня нет доступа к защищенному методу printName из класса Apple, поскольку они находятся в разных пакетах. Я получаю следующую ошибку:
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????
}
}
Почему это позволяет мне обращаться к защищенному члену другого класса в другом пакете по ссылке? Это должен быть незаконный доступ, не так ли?
Я в замешательстве! Кто-нибудь, пожалуйста, помогите.
Код был скомпилирован с использованием Java 1.6.0_18.