JLS 6.6.7 отвечает на ваш вопрос. Подкласс обращается только к защищенным членам своего родительского класса, если он включает реализацию своего родителя. Следовательно, вы не можете создать экземпляр родительского объекта в дочернем классе, если родительский конструктор защищен и находится в другом пакете ...
6.6.7 Пример: защищенные поля, методы и конструкторы
этот пример, где пакет очков
заявляет:
package points;
public class Point {
protected int x, y;
void warp(threePoint.Point3d a) {
if (a.z > 0) // compile-time error: cannot access a.z
a.delta(this);
}
}
и пакет ThreePoint объявляет:
package threePoint;
import points.Point;
public class Point3d extends Point {
protected int z;
public void delta(Point p) {
p.x += this.x; // compile-time error: cannot access p.x
p.y += this.y; // compile-time error: cannot access p.y
}
public void delta3d(Point3d q) {
q.x += this.x;
q.y += this.y;
q.z += this.z;
}
}
, который определяет класс Point3d.
ошибка компиляции происходит в
метод delta здесь: он не может получить доступ
защищенные члены х и у его
параметр р, потому что пока Point3d
(класс, в котором ссылки на
поля х и у встречаются) является подклассом
Точка (класс, в котором х и у
заявлено), не участвует в
реализация точки (тип
параметр р). Метод delta3d
может получить доступ к защищенным членам
его параметр q, потому что класс
Point3d является подклассом Point и является
участвует в реализации
Point3d. Метод дельта может попытаться
приведите (§5.5, §15.16) свой параметр к
быть Point3d, но этот актерский состав будет
сбой, вызывая исключение, если
класс р во время выполнения не было
Point3d.
Ошибка времени компиляции также происходит в
метод деформации: он не может получить доступ к
защищенный член z его параметра а,
потому что в то время как класс Point (
класс в котором ссылка на поле
z происходит) участвует в
реализация Point3d (тип
параметра а), это не
подкласс Point3d (класс в
который объявлен z).