Вопрос

В 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 для любого класса.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top