Доступность переменной экземпляра 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.

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

Другие вопросы по тегам