В ниже кода Потребительский класс может получить доступ к защищенному методу Родительского класса. Как это возможно, так как нет никакого отношения между Родительским и Потребительским классом. Объясните
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();
}
}
Спасибо
protected
означает: тот же пакет или наследование. Поскольку ваши классы оба находятся в пакете по умолчанию
(не рекомендуется в реальной жизни), protected
разрешает доступ. Кстати: если вы пытались проверить управление доступом в java, вы забыли default access
(default access
= no modifier = package private
).
private
доступ с другой стороны означает: доступ ниоткуда, кроме данного конкретного класса (и нестатических внутренних классов, которые все равно являются членами класса-хозяина).
Вот соответствующие выдержки из спецификации языка Java:
JLS 6.6 Access Control
Язык программирования Java guage предоставляет механизмы для управления доступом , чтобы пользователи пакета
или
класса
не зависели от ненужных деталей реализации этогопакета
] иликласс
. Если доступ разрешен, то объект, к которому осуществляется доступ, называется доступным .JLS 6.6.1 Определение доступности
- [...]
- Член / конструктор ссылочного типа доступен, только если тип доступен, а член / конструктор объявлен для разрешения доступа:
public
: доступ разрешен.protected
: доступ разрешен, только если выполняется одно из следующих условий :
- Доступ к члену или конструктору осуществляется из пакета
, содержащего класс, в котором объявлен член или конструктор
protected
.- Доступ правильный, как описано в JLS 6.6.2 Подробная информация о
защищенном
доступе .
- К
защищенному
члену / конструктору объекта можно получить доступ извнепакета
, в котором он объявлен только кодом, который отвечает за реализацию этого объекта.private
: доступ разрешен тогда и только тогда, когда он происходит в теле класса верхнего уровня, который включает объявление члена или конструктора.- В противном случае мы говорим, что существует доступ по умолчанию , который разрешен только тогда, когда доступ осуществляется из пакета
, в котором объявлен тип.
Раздел, выделенный жирным шрифтом, является ответом на вопрос в этом сценарии: Родитель
и Потребитель
принадлежат одному и тому же пакету
, таким образом, по крайней мере , защищенные
члены Родителя
доступны из Потребителя
.
Во-первых, они находятся в одном пакете. Во-вторых, Consumer является внутренним классом Parent.
Адам, вы правы! Они находятся в одном пакете, поэтому класс consumer может получить доступ к защищенному методу родительского класса. Consumer не является внутренним классом родительского класса.