Защищенный доступ Java не работает

В java есть три уровня доступа:

  • Public - открыт для всего мира
  • Частный - открыт только для класса
  • Защищено - открыто только для класса и его подклассов (наследование).

Так почему же компилятор java позволяет этому случиться?

TestBlah.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
    }
}

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}

person Anton    schedule 02.12.2008    source источник
comment
Также есть пакетный доступ. Это значение по умолчанию без модификатора.   -  person jjnguy    schedule 02.12.2008
comment
Вы уверены, что правы - a.testing и b.testing не заявлены. Вы имели в виду a.message и b.message?   -  person chickeninabiscuit    schedule 02.12.2008
comment
Есть четыре уровня доступа. Работает так, как задумано.   -  person erickson    schedule 02.12.2008
comment
Я надеялся, что у Java будет доступ, аналогичный C ++ и C #. +1 за вопрос   -  person dbones    schedule 10.01.2010


Ответы (5)


Собственно должно быть:

Открыто только для классов в одном пакете класс и его подклассы (наследование)

Вот почему

person OscarRyz    schedule 02.12.2008

Поскольку защищенный означает подкласс или других классов в том же пакете.

И на самом деле существует четвертый уровень доступа «по умолчанию», когда модификатор опущен, что обеспечивает доступ к другим классам в том же пакете.

Таким образом, protected находится между значением по умолчанию и доступом public.

person Lawrence Dol    schedule 02.12.2008

Чтобы быть более конкретным, вы ожидаете, что protected будет работать так же, как в C ++.

Однако в Java это имеет другое значение. В Java защищенный метод доступен для класса (очевидно), всех других классов в том же пакете и любых подклассов этого класса. Классы в других пакетах не будут иметь доступа, если они не являются подклассом этого исходного класса.

Подробнее см. в этом аналогичном вопросе конкретная информация о маркерах наследования.

Лично я почти не использую protected. Я разрабатываю приложения, а не фреймворки, поэтому с большей вероятностью я буду определять public методы, private данные и, довольно часто, отмечать весь свой класс как final.

person Bob Cross    schedule 02.12.2008

На самом деле существует четыре уровня доступа: «публичный», «защищенный», «частный» и стандартный, также известный как частный пакет или защищенный пакет. По умолчанию ограничивает доступ к пакету. Значение по умолчанию весьма полезно, и я часто им пользуюсь.

person Julien Chastang    schedule 02.12.2008

Вы можете вызвать b.getMessage(), потому что b относится к типу Bloo, который расширяет Blah, а getMessage() защищен. Protected, как вы упомянули, позволяет подклассам получать доступ к методу.

Однако у вас есть следующие ошибки:

  • Вызов super() без аргументов в конструкторе Bloo является ошибкой. Компилятор не может найти конструктор Blah без параметров, потому что вы определили его с параметром String.
  • Вызов new Blah() в методе TestBlah main является ошибкой по той же причине, что и выше.
  • Ссылка на a.testing и b.testing является ошибкой, потому что вы не определили переменную testing ни для одного класса.
person Bill the Lizard    schedule 02.12.2008
comment
Хе-хе, думаю, я никогда не узнаю, сделал ли он это специально. Эй, забавно, что ящерица отвечает дракону. :) - person OscarRyz; 02.12.2008