Во время подготовки к экзамену 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
Предположим, что protected name;
в первом блоке кода написан как protected String name;
и public class Swan{
во втором блоке кода написан как public class Swan extends Bird {
Тогда
сheck2() компилируется потому, что Swan является наследником Bird. Соответственно, доступ к protected-полям у него есть.
check3() не компилируется скорее всего потому, что Вы имя объекта bird написали такое же, как имя пакета. Попробуйте его переименовать, т.к. в общем-то check3() выводит то же самое, что нормально компилящийся check1(), а создание объекта класса Bird ни к чему не обязывает и ни на что в данном случае не влияет.
к protected-членам класса можно получить доступ только внутри наследуемого класса (сheck2 компилируется, он внутри производного класса, получает доступ к защищенному члену базового класса), а вне этого класса (т.е. для объектов производного класса) доступ закрыт. Но самое главное, protected ведет себя так же, как и private для объектов базового класса! Т.е. доступ для объектов базового класса для защищенных переменных и методов - закрыт.
Bird bird = new Bird(); // создали объект базового класса
System.out.print(bird.name); /* а тут пытаетесь получить доступ к защищенному (=закрытому) члену этого класса через объект.*/
И кстати, компилятор написал тоже самое. Вчитайтесь просто внимательнее: "name has protected access in Bird" - свойство name является защищенным в Bird, т.е. к нему невозможно получить доступ вне этого класса, т.е. объекты этого класса не смогут получить доступ к name (так же как и к private-членам).
Если при создании класса Class2 пакета package2 используется наследование от класса Class1 из пакета package1, то Class2 получает доступ только к public членам Class1. Бывают случаи, когда это нужно.
Таким образом protected даёт доступ внутри пакета - везде, в других пакетах - только в наследниках.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вот здесь похожий вопросОтвет кроется в вашем методе main(){} как уже подметил @Grundy
В componentDidUpdate делаю второй поход за данными, что бы после добавления новой задачи( компонент AddTaskInput), изменения статуса или удаления (компонент...
Предположим имеется 1 изображение машиныНеобходимо создать два объекта Image с этой машиной и двигать эти два изображения асинхронно