public class MyTest {
public static void main(String str[]){
Info i=new Info();
i.value=20;
System.out.println("Integer value is :"+i.value);
}
}
class Info {
int value;
protected Info(){
System.out.println("Class with protected constructor");
}
}
→ Я что-то пропустил в отношении защищенного модификатора, но не мог понять. → До сих пор я читал, что класс с защищенным конструктором может быть создан только его субклассами, и это тоже в одном пакете или в другом пакете. Тогда как получилось, что это дает мне этот результат: класс с защищенным конструктором. Целое число: 20
Protected
члены доступны из Class
, Same package
и того Same package
и в Subclass
. Он не имеет доступа к World
(кроме упомянутого выше)
См. Таблицу ниже
В следующей таблице показан доступ к членам, разрешенным каждым модификатором.
Access Levels
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Потому что оба класса, MyTest
и Info
находятся в одном пакете.
Классы в одном пакете могут без проблем получить доступ к защищенным членам
Если член или конструктор объявлен защищенным, доступ разрешен только тогда, когда выполняется одно из следующих условий:
- Доступ к члену или конструктору происходит изнутри пакета, содержащего класс, в котором защищенный член или конструктор
объявлен.
Проверьте JLS 6.6.2
Что вам поможет в долгосрочной перспективе - знать, что доступ к НИЧЕГО может быть доступен и управляться только подклассами. Это включает в себя методы, переменные и т.д. Классы, находящиеся в том же пакете, что и класс с защищенным конструктором, все еще "осведомлены" о переменных, расположенных внутри конструктора. Поэтому вы получаете свой вывод "Класс с защищенным конструктором Целое значение: 20", потому что два класса находятся в одном пакете.