Доступность переменных экземпляра 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
И все это защита времени компиляции, они могут быть легко переопределены через отражение во время выполнения.