Доступность защищенного 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();
}
}
Спасибо
Ответы
Ответ 1
protected
означает: тот же пакет или по наследованию. Поскольку ваши классы находятся в default package
(не рекомендуется в реальной жизни), protected
разрешает доступ. Кстати: если вы пытались проверить управление доступом java, вы забыли default access
(default access
= no modifier = package private
).
private
доступ с другой стороны означает: доступ из ниоткуда, кроме этого конкретного класса (и нестатические внутренние классы, которые все еще являются членами хост-класса).
Ответ 2
Вот соответствующие выдержки из спецификации языка Java:
Язык программирования Java предоставляет механизмы управления доступом, чтобы предотвратить использование пользователей package
или class
в зависимости от ненужных деталей реализации этого package
или class
. Если доступ разрешен, то доступный объект считается доступным.
- [...]
- Член/конструктор ссылочного типа доступен только в том случае, если тип доступен, и объявляется член/конструктор для разрешения доступа:
-
public
: доступ разрешен. -
protected
: доступ разрешен только тогда, когда выполняется одно из следующих значений:: - Доступ к члену или конструктору происходит из
package
, содержащего класс, в котором объявлен член или конструктор protected
.. strong > - Доступ является правильным, как описано в JLS 6.6.2 Подробная информация о
protected
Доступ. - A
protected
элемент/конструктор объекта может быть доступен извне package
, в котором он объявляется только кодом, ответственным за реализацию этого объекта.
-
private
: доступ разрешен тогда и только тогда, когда он встречается внутри тела класса верхнего уровня, который включает объявление члена или конструктора. - В противном случае мы говорим, что есть доступ по умолчанию, который разрешен только тогда, когда доступ происходит из
package
, в котором объявлен тип.
Раздел, выделенный жирным шрифтом, является ответом на вопрос в этом сценарии: Parent
и Consumer
принадлежат к одному и тому же package
, поэтому, по крайней мере, protected
члены Parent
доступны из Consumer
.
См. также
Ответ 3
Из-за защиты пакета.
http://mindprod.com/jgloss/packagescope.html
Ответ 4
Прежде всего, они находятся в одном пакете. Во-вторых, потребитель - это внутренний класс родителя.
Ответ 5
Адам, ты прав!
Они находятся в одном пакете, поэтому потребительский класс может получить доступ к защищенному методу родительского класса. Потребитель не является внутренним классом родителя.