Подтвердить что ты не робот

Доступность защищенного Java-метода

В приведенном ниже коде класс Consumer может получить доступ к защищенному методу родительского класса. Как это возможно, поскольку между родительским и потребительским классами нет никакой связи. Пожалуйста, объясните

class Parent {
    public void method1(){
        System.out.println("PUBLIC METHOD");
    }
    private void method2(){
        System.out.println("PRIVATE METHOD");
    }
    protected void method3(){
        System.out.println("PROTECTED METHOD");
    }
}

public class Consumer {
    public static void main(String[] args){
        Parent parentObj = new Parent();
        parentObj.method1();
        //parentObj.method2();
        parentObj.method3();
    }
}

Спасибо

4b9b3361

Ответ 1

protected означает: тот же пакет или по наследованию. Поскольку ваши классы находятся в default package (не рекомендуется в реальной жизни), protected разрешает доступ. Кстати: если вы пытались проверить управление доступом java, вы забыли default access (default access= no modifier = package private).

private доступ с другой стороны означает: доступ из ниоткуда, кроме этого конкретного класса (и нестатические внутренние классы, которые все еще являются членами хост-класса).

Ответ 2

Вот соответствующие выдержки из спецификации языка Java:

JLS 6.6 Контроль доступа

Язык программирования Java предоставляет механизмы управления доступом, чтобы предотвратить использование пользователей package или class в зависимости от ненужных деталей реализации этого package или class. Если доступ разрешен, то доступный объект считается доступным.

JLS 6.6.1 Определение доступности

  • [...]
  • Член/конструктор ссылочного типа доступен только в том случае, если тип доступен, и объявляется член/конструктор для разрешения доступа:
    • public: доступ разрешен.
    • protected: доступ разрешен только тогда, когда выполняется одно из следующих значений::
      • Доступ к члену или конструктору происходит из package , содержащего класс, в котором объявлен член или конструктор protected .. strong >
      • Доступ является правильным, как описано в JLS 6.6.2 Подробная информация о protected Доступ.
        • A protected элемент/конструктор объекта может быть доступен извне package, в котором он объявляется только кодом, ответственным за реализацию этого объекта.
    • private: доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня, который включает объявление члена или конструктора.
    • В противном случае мы говорим, что есть доступ по умолчанию, который разрешен только тогда, когда доступ происходит из package, в котором объявлен тип.

Раздел, выделенный жирным шрифтом, является ответом на вопрос в этом сценарии: Parent и Consumer принадлежат к одному и тому же package, поэтому, по крайней мере, protected члены Parent доступны из Consumer.

См. также

Ответ 4

Прежде всего, они находятся в одном пакете. Во-вторых, потребитель - это внутренний класс родителя.

Ответ 5

Адам, ты прав! Они находятся в одном пакете, поэтому потребительский класс может получить доступ к защищенному методу родительского класса. Потребитель не является внутренним классом родителя.