Страницы

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

вторник, 28 января 2020 г.

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

#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;

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

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