Помогите разобраться с protected?

134
25 декабря 2020, 05:40

Во время подготовки к экзамену OCA по Боярскому, встретил пример на стр.178 Он касается модификатора доступа protected и звучит примерно так, что есть класс Bird в пакете bird:

package bird;
public class Bird{
    protected String name;
}

и есть его наследник Swan в пакете swan:

package swan;
import bird.Bird;
public class Swan extends Bird{
   public void check1(){
      System.out.print(name);
   }
   public void check2(){ 
      Swan swan = new Swan();
      System.out.print(swan.name);
   }
   public void check3(){
      Bird bird = new Bird();
      System.out.print(bird.name);
   }
}

-check1 компилируется и все хорошо(доступ через наследование)

-сheck2 компилируется, но почему? Я ведь обращаюсь к полю name не через наследование, и не нахожусь в том же пакете что и Bird. Почему тогда name доступен?

-check3 не компилируется вообще, со словами name has protected access in Bird

Answer 1

Предположим, что protected name; в первом блоке кода написан как protected String name; и public class Swan{ во втором блоке кода написан как public class Swan extends Bird {

Тогда

сheck2() компилируется потому, что Swan является наследником Bird. Соответственно, доступ к protected-полям у него есть.

check3() не компилируется скорее всего потому, что Вы имя объекта bird написали такое же, как имя пакета. Попробуйте его переименовать, т.к. в общем-то check3() выводит то же самое, что нормально компилящийся check1(), а создание объекта класса Bird ни к чему не обязывает и ни на что в данном случае не влияет.

Answer 2

к protected-членам класса можно получить доступ только внутри наследуемого класса (сheck2 компилируется, он внутри производного класса, получает доступ к защищенному члену базового класса), а вне этого класса (т.е. для объектов производного класса) доступ закрыт. Но самое главное, protected ведет себя так же, как и private для объектов базового класса! Т.е. доступ для объектов базового класса для защищенных переменных и методов - закрыт.

Bird bird = new Bird(); // создали объект базового класса

System.out.print(bird.name); /* а тут пытаетесь получить доступ к защищенному (=закрытому) члену этого класса через объект.*/

И кстати, компилятор написал тоже самое. Вчитайтесь просто внимательнее: "name has protected access in Bird" - свойство name является защищенным в Bird, т.е. к нему невозможно получить доступ вне этого класса, т.е. объекты этого класса не смогут получить доступ к name (так же как и к private-членам).

Answer 3

Если при создании класса Class2 пакета package2 используется наследование от класса Class1 из пакета package1, то Class2 получает доступ только к public членам Class1. Бывают случаи, когда это нужно.

Таким образом protected даёт доступ внутри пакета - везде, в других пакетах - только в наследниках.

READ ALSO
Что значит ошибка: reached end of file while parsing }

Что значит ошибка: reached end of file while parsing }

Вот здесь похожий вопросОтвет кроется в вашем методе main(){} как уже подметил @Grundy

326
Получить отдельные параметры даты объекта Date

Получить отдельные параметры даты объекта Date

На клиенте в браузере получаю дату:

115
React - бесконечный render

React - бесконечный render

В componentDidUpdate делаю второй поход за данными, что бы после добавления новой задачи( компонент AddTaskInput), изменения статуса или удаления (компонент...

188
Асинхронное движение изображений в js (canvas)

Асинхронное движение изображений в js (canvas)

Предположим имеется 1 изображение машиныНеобходимо создать два объекта Image с этой машиной и двигать эти два изображения асинхронно

127