#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;
Комментариев нет:
Отправить комментарий