Доступность переменных экземпляра Java

В чем разница в доступности следующих переменных в Java?

public class Joe {
    public int a;
    protected int b;
    private int b;
    int c;
}

Меня больше всего интересует то, что делает последний.

Ответы

Ответ 1

  • public: чтение/запись для всех
  • protected: чтение/запись для экземпляры подклассов и из встроенного пакета
  • private: чтение/запись для любого экземпляра класса и внутренний или внешний (охватывающий) экземпляр
  • int c: пакет-частный, чтение/запись для все классы внутри одного пакета

Подробнее см. JLS

EDIT: добавлен комментарий для защищенных, в котором говорится, что доступ предоставляется из одного и того же пакета, вы, парни, совершенно правы. Также добавлен комментарий для частного. Я помню сейчас...; -)

Ответ 2

Извините за ответные исправления на один предыдущий ответ, но у меня нет достаточной репутации для непосредственного изменения...

  • общедоступный - для чтения/записи для всех
  • protected - чтение/запись для подклассы экземпляров и все классы внутри такой же пакет
  • int c: package-private, читать/записывать для всех классов внутри тот же пакет
  • private - чтение/запись для любого члена самого класса и внутренних классов (если есть)

Лучше заказать модификаторы доступа таким образом, от самого широкого доступа (общедоступного) до самого узкого (частного), зная, что при переходе от узкого к широкому вы не теряете никаких возможностей.

Это особенно важно для "защищенных", где часто неправильно понимают, что классы в одном пакете также могут обращаться к защищенным членам класса (а не только к его подклассам).

Ответ 3

Я пытаюсь полностью избежать доступа к уровню пакета (последний доступ к вам).

Мне нравится держать классы автономными. Если другому классу нужен доступ к чему-то в моем классе, он должен быть общедоступным (и должен быть методом, а не атрибутом). В противном случае я чувствую, что вы нарушили encapsulation, как описано в Абстракция VS Информация, скрывающая VS-инкапсуляцию.

Ответ 4

И все это защита времени компиляции, они могут быть легко переопределены через отражение во время выполнения.