Вам не разрешен доступ к A
, потому что вы все еще вне подкласса или пакета.Метод main
- static
, поэтому он не связан с экземплярами класса B
.Чтобы получить доступ к A
, вы должны быть внутри класса B
, поэтому в нестатическом контексте, таком как
public class B extends A {
public void foo() {
m1(); // Valid call since inside subclass
}
}
Я думаю, вы неправильно поняли, что static
означает.
Подробности protected
описаны в Спецификации языка Java .Извлечение из JLS§6.6.2 :
protected
Член или конструктор объекта может быть доступен извне пакета, в котором он объявлен только кодом, который отвечает за реализацию этого объекта.
Пусть C
будет классом, в котором объявлен protected
член.Доступ разрешен только внутри тела подкласса S
из C
.
Ограничение даже выходит за рамки вашего примера.Ключ « отвечает за реализацию ».Сравните это со следующим примером:
public class Point {
protected int x;
protected int y;
}
public class Point3D extends Point {
public void delta(Point other) {
other.x += this.x; // Compile-time error: Cannot access other.x
other.y += this.y; // Compile-time error: Cannot access other.y
}
}
Хотя класс Point3D
является подклассом Point
, он не отвечает за реализацию объекта other
.Таким образом, ему не разрешен доступ к protected
членам.
То же самое для
public class B extends A {
public void foo() {
A other = new A();
other.m1(); // Compile-time error
}
}
, поскольку текущий экземпляр, к которому принадлежит вызов метода foo()
, не отвечает зареализация other
.Таким образом, доступ не разрешен.