Страницы

Поиск по вопросам

вторник, 26 марта 2019 г.

Не доступен protected член из подкласса в другом пакете

Почему возникает ошибка в закомментированной строчке, ведь protected челны класса, доступны классам, находящимся в том же пакете,и подклассам — в других пакетах.
package one; public class One { protected int val; }
Если такой же класс создать в пакете package one, то в закомментированной строке ошибки уже не будет. Для static переменной в обоих случаях ошибки не будет.
package two; import one.One; public class Two extends One{ private One o = new One(); //private int val = o.val; }


Ответ

В дополнение к этому правильному ответу, несколько слов о мотивации.
Если бы производный класс имел бы доступ к protected-полям любого объекта базового типа, то было бы очень легко обойти инкапсуляцию. Действительно, пусть у вас есть объект типа A, и protected-поле x. Тогда вы из любой точки кода смогли бы получить доступ к x, используя такой простой трюк:
class FakeA extends A { public void SetXFor(A obj, int x) { obj.x = x; } }
new FakeA().SetXFor(obj, 42);
Чтобы такие трюки были невозможны, доступ к protected-членам и ограничен текущим экземпляром объекта.

Комментариев нет:

Отправить комментарий