Почему возникает ошибка в закомментированной строчке, ведь 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-членам и ограничен текущим экземпляром объекта.
Комментариев нет:
Отправить комментарий