Доступ к защищенным членам вне пакета со ссылкой на дочерний класс - PullRequest
0 голосов
/ 20 мая 2018
package pack1;
class A{
   protected void m1(){
      System.out.println("protected modifier");
   }
}

package pack2;
class B extends A{
    public static void main(string[]args){
         B b = new B();//Valid
         b.m1();

        A a = new B();//Invalid
          a.m2();

       A a1 = new A();//InValid
         a1.m1();

   }
}

Почему при доступе к защищенным элементам вне пакета нам нужна только ссылка на дочерний класс .?

Почему мы не можем использовать родительскую ссылку для доступа к защищенным элементам (Здесь A a = new B ())?

Я просмотрел блоги и много ответов о переполнении стека, но не нашел ответа для ПОЧЕМУ?.

, поэтому кто-нибудь может помочь мне узнать ответ ПОЧЕМУ?

1 Ответ

0 голосов
/ 20 мая 2018

Вам не разрешен доступ к 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.Таким образом, доступ не разрешен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...