Доступность переменной экземпляра Java
В чем разница в доступности следующих переменных в Java?
public class Joe {
public int a;
protected int b;
private int b;
int c;
}
Меня больше всего интересует то, что делает последний.
4 ответа
- общедоступный: для чтения / записи для всех
- защищенный: чтение / запись для экземпляров подклассов и изнутри пакета
- private: чтение / запись для любого экземпляра класса и внутреннего или внешнего (включающего) экземпляра
- int c: package-private, доступный для чтения / записи для всех классов в одном пакете
Смотрите JLS для более подробной информации
РЕДАКТИРОВАТЬ: Добавлен комментарий для защищенного заявления о том, что доступ предоставляется из одного пакета, вы, ребята, совершенно правы. Также добавлен комментарий для частного. Я вспомнил...;-)
Извините, что отвечаю на исправления к одному предыдущему ответу, но у меня недостаточно репутации для непосредственного изменения...
- общедоступный - для чтения / записи для всех
- protected - чтение / запись для экземпляров подклассов и всех классов внутри одного пакета
- int c: package-private, доступный для чтения / записи для всех классов в одном пакете
- private - чтение / запись для любого члена этого класса и внутренних классов (если есть)
Лучше заказать модификаторы доступа таким образом, от самого широкого доступа (публичного) до самого узкого (частного), зная, что при переходе от узкого к широкому вы не теряете никаких возможностей.
Это особенно важно для "защищенных", где часто неправильно понимают, что классы в одном и том же пакете могут также обращаться к защищенным членам класса (не только к его подклассам).
Я стараюсь полностью избежать доступа на уровне пакетов (последний доступ, который вы упомянули).
Мне нравится держать классы автономными. Если другому классу нужен доступ к чему-либо в моем классе, он должен быть общедоступным (и это должен быть метод, а не атрибут). В противном случае я чувствую, что вы нарушили инкапсуляцию, как объяснено в Abstraction VS Information Hiding VS Encapsulation.
И все они являются защитой времени компиляции, их можно легко переопределить путем отражения во время выполнения.