package p1;
public class X {
protected void abc(){
System.out.println("X");
}
}
_____________________________________________________
package p2;
import p1.X;
public class Y extends X{
public void abc() {
System.out.println("Y");
}
public void test(){X x = new Y();x.abc();} //в этой строке компилятор сообщает о том, что не может обратиться к методу abc(), так как он protected
public static void main(String[] args) {
Y a = new Y(); a.abc();a.test();
}
}
Почему недоступно обращению к методу, если класс Y наследуется от X, а при наследовании доступ к методам protected должен быть открыт?
Alexander Gromov
19 уровень
protected
в классе C, извне пакета, в котором объявлен класс C, может быть осуществлён с помощью обращения E.id или E.id(,,,), только в теле наследника класса C - классе S, и только при условии, что выражение E имеет тип S. JLS -> 6.6.2.1. Access to a protected Member: Let C be the class in which a protected member is declared. Access is permitted only within the body of a subclass S of C. ... then access to the instance field Id is permitted if and only if the qualifying type is S or a subclass of S. ... then access to the instance method Id is permitted if and only if the qualifying type is S or a subclass of S. Именно поэтому метод не мог быть скомпилирован, в отличие от метода