Почему защищенная переменная суперкласса недоступна из подкласса?

Я пытаюсь понять, почему защищенная переменная в суперклассе недоступна в дочернем классе?

package pack1;

public class Parent {

    protected int r;

    public int s;
}



package pack2;

import pack1.Parent;

public class Child extends Parent {

    public static void main(String[] args) {

        Parent obj = new Child();
        obj.r = 2;      //r is not accessible here. It becomes accessible when I make it static.
        obj.s = 3;      //s is accessible.
    }
}

person J Dev    schedule 08.09.2018    source источник
comment
main - это статический метод, а не метод объекта. Вы сможете получить доступ к 'r' напрямую из любого нестатического кода в Child.   -  person Tom Drake    schedule 08.09.2018
comment
Это называется инвариантностью и ковариантностью. Если вы погуглите, вы найдете учебные пособия, которые могут объяснить это намного лучше, чем мы, в ответе здесь. см. это, чтобы понять разницу между public , protected и private   -  person V-rund Puro-hit    schedule 08.09.2018
comment
@TomDrake Спасибо за ответ! Итак, я создал экземпляр Parent, т.е. obj... мой вопрос: почему общедоступная переменная s доступна, а защищенная переменная r - нет?   -  person J Dev    schedule 08.09.2018
comment
здесь вы используете экземпляр родительского класса, который является базовым классом, поэтому в другом пакете он недоступен. Используйте дочерний класс вместо родительского   -  person vinay chhabra    schedule 08.09.2018
comment
@vinay chhabra Спасибо, Винай!   -  person J Dev    schedule 08.09.2018
comment
Метод в подклассе может получить доступ к защищенному члену в суперклассе только через экземпляр подкласса. Я отсылаю вас к JLS 6.6.2, 6.6.2.1 и 6.6.2.2.   -  person nabster    schedule 08.09.2018
comment
@nabsATX Спасибо!   -  person J Dev    schedule 08.09.2018
comment
Почему к защищенному члену суперкласса нельзя получить доступ из подкласса, используя ссылку суперкласса? xyzws.com/Javafaq/   -  person J Dev    schedule 08.09.2018