Java — Какого типа защищенные переменные в подклассах?

#java #inheritance #access-modifiers

Вопрос:

Недавно я практиковал тему наследования на Java. Я наткнулся на это утверждение, что « protected переменные-члены в суперклассе находятся private в подклассе».

Мой вопрос в том, что если сам подкласс является родителем другого подкласса, сможет ли этот подкласс получить доступ к переменным-членам базового класса?

 public class A
{
    protected int a;

    public A(int a)
    {
        this.a = a;
    }
}

public class B extends A
{
    public B(int a) 
    {
         super(a);
    }
}

public class C extends B
{
    public C(int a)
    {
        super(a);
    }

    @Override
    public String toString()
    {
        return (""   this.a);
    }
}

public class Test
{
    public static void main(String args[])
    {
        C c = new C(5);
        System.out.println(c);
    }
}
 

Сможет C ли суб-подкласс of A получить доступ a , поскольку , согласно приведенной выше логике , protected становится private в B, а private переменные не могут быть унаследованы?

Тестирование этого печатает 5, как это работает тогда?

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

1. Хорошая работа по тестированию и опровержению определенно неправильного утверждения! В точку!

Ответ №1:

Я столкнулся с тем фактом, что «защищенные переменные-члены в суперклассе являются частными в подклассе».

Позвольте мне исправить это для вас:

Я наткнулся на эту ложь, что «защищенные переменные-члены в суперклассе являются частными в подклассе».

Как показывает ваш эксперимент, ваш «факт» был пустым звуком. Не уверен, откуда вы это взяли; термины туманны, и, возможно, в предложении, которое вы прочитали, этим словам приписывались разные значения (частный, защищенный, переменная-член, подкласс, суперкласс), но поскольку эти слова довольно хорошо определены, мне трудно представить, к чему это может привести. Возможно, директива стиля (например, вы ДОЛЖНЫ относиться к защищенным вещам от родителя вашего родителя так, как если бы они были частными, т. Е. Не прикасайтесь к ним).

Если это директива по стилю, то я тоже с ней не согласен. Очевидным аргументом является «они являются деталями реализации вашего родительского класса», и это бросается в глаза практически при каждом разумном использовании наследования, поэтому, если нет другой причины, по которой я отсутствую, это тоже неправильно.