#java
Почему возникает ошибка в закомментированной строчке, ведь 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; }
Ответы
Ответ 1
В дополнение к этому правильному ответу, несколько слов о мотивации. Если бы производный класс имел бы доступ к 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-членам и ограничен текущим экземпляром объекта.Ответ 2
На первый взгляд, ошибки в вашем коде не видно, но она есть. Вы правы, protected свойства доступны для наследников в других пакетах. Но посмотрите, как вы обращаетесь из Two к родителю: private One o = new One(); Вы не используете здесь родственные связи. Вы просто создали новый экземпляр класса, никак не связанный с вашим. Если вы хотите обратиться к родительскому классу, следует использовать ключевое слово super: private int val = super.val;
Комментариев нет:
Отправить комментарий