Защищенный доступ Java не работает
-
22-07-2019 - |
Вопрос
В Java есть три уровня доступа:
- Публичный – открытый миру
- Частный – открыт только для класса.
- Защищенный — открыт только для класса и его подклассов (наследование).
Так почему же компилятор Java позволяет этому случиться?
ТестBlah.java:
public class TestBlah {
public static void main(String[] args) {
Blah a = new Blah("Blah");
Bloo b = new Bloo("Bloo");
System.out.println(a.getMessage());
System.out.println(b.getMessage()); //Works
System.out.println(a.testing);
System.out.println(b.testing); //Works
}
}
Бла.java:
public class Blah {
protected String message;
public Blah(String msg) {
this.message = msg;
}
protected String getMessage(){
return(this.message);
}
}
Блу.java:
public class Bloo extends Blah {
public Bloo(String testing) {
super(testing);
}
}
Решение
На самом деле должно быть:
Открыт только для занятия в одном пакете класс и его подклассы (наследование)
Вот почему
Другие советы
Потому что защищенный означает подкласс или другие классы в том же пакете.
И на самом деле существует четвертый уровень доступа «по умолчанию», когда модификатор опущен, который обеспечивает доступ к другим классам в том же пакете.
Так protected
находится между значением по умолчанию и public
доступ.
Если быть более конкретным, вы ожидаете protected
работать так же, как в C++.
Однако в Java это имеет другое значение.В Java защищенный метод доступен классу (очевидно), всем остальным классам в том же пакете и любым подклассам этого класса.Классы в других пакетах не будут иметь доступа, если они не станут подклассами исходного класса.
Посмотрите этот похожий вопрос для получения более конкретной информации об маркерах наследования.
Лично я почти не использую protected
.Я разрабатываю приложения, а не фреймворки, поэтому у меня гораздо больше шансов определить public
методы, private
данные и довольно часто отмечаю весь мой класс как final
.
На самом деле существует четыре уровня доступа:«публичный», «защищенный», «частный» и по умолчанию, также известный как частный пакет или защищенный пакет.По умолчанию ограничивает доступ к пакету.Значение по умолчанию весьма полезно, и я часто его использую.
Вы можете позвонить b.getMessage()
потому что b
имеет тип Bloo
, который простирается Blah
, и getMessage()
защищен.Как вы упомянули, Protected позволяет подклассам получать доступ к методу.
Однако у вас есть следующие ошибки:
- Вызов
super()
без каких-либо аргументов вBloo
конструктор - ошибка.Компилятор не может найти no-параметрBlah
конструктор, потому что вы определили его с параметром String. - Вызов
new Blah()
вTestBlah
main
метод является ошибкой по той же причине, что и выше. - Ссылаясь на
a.testing
иb.testing
это ошибка, потому что вы не определили переменнуюtesting
для любого класса.