Взаимодействие между видимостью класса и полей - PullRequest
2 голосов
/ 10 марта 2010

Я узнал, что класс может быть открытым или закрытым для пакета (последнее значение по умолчанию). Поле класса также может быть открытым или закрытым для пакета. Эти «статусы» имеют одинаковое значение. Если что-то является закрытым для пакета, это видно только внутри одного пакета. Публично видно везде (из любой упаковки).

Что мне не понятно, так это взаимодействие этих статусов. В частности, меня интересуют следующие два случая:

  1. Класс публичный, но его поле закрыто. Будет ли это поле видно только из пакета?

  2. Класс является закрытым для пакета и имеет открытое поле. Где будет петь это поле?

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

Ответы [ 3 ]

5 голосов
/ 10 марта 2010

Применяется самая ограниченная видимость. Ответы на ваши вопросы:

  1. Да.
  2. Пакет только.

открытые поля в классах пакетов обычно не имеют особого смысла.

Есть некоторые тонкости: закрытое поле в закрытом вложенном классе может быть прочитано включающим классом (хотя это приводит к некоторой потере производительности из-за неявного добавления искусственных средств доступа).

В уроке Sun есть краткое замечание о видимости. Также обратитесь к разделу о вложенных классах.

Редактировать: Для вашего интереса, отражение также позволяет вмешиваться в видимости.

1 голос
/ 10 марта 2010

Вы можете думать о видимости как об иерархии. Вам должно быть разрешено видеть класс, прежде чем вы сможете увидеть любого из его членов или функций. Имея это в виду, ваши два сценария разрешаются как:

  1. Да, класс в том же пакете может видеть закрытые поля пакета в открытом классе.
  2. Только классы в одном и том же пакете могут видеть открытые члены и функции в закрытом классе пакета.

Если вы пишете API-интерфейсы, которые, как вы ожидаете, будут использовать другие, рекомендуется использовать закрытый пакет, чтобы скрыть окружающие классы, которые помогут вам в разработке, но не вносят вклад в API.

1 голос
/ 10 марта 2010
  1. Если класс открытый, то все члены класса «потенциально» видимы. Но, как вы говорите, поле будет видно только внутри пакета.

  2. Если класс не виден, то как вы будете ссылаться на поле? Так что да, он будет ограничен только пакетом.

Конечно, стоит отметить, что большую часть времени вам не следует использовать открытые поля, если они не являются константами.

Я не понял вашу последнюю мысль, когда впервые прочитал ее, но я думаю, вы спрашиваете, почему стоит устанавливать модификатор ограничения доступа к классу, когда вы можете просто ограничить доступ к методам. Одна из причин, по которой вы не можете полагаться на поля / методы для предоставления ограничения, заключается в том, что расширяющийся класс (возможно, в другом пакете) может увеличить видимость метода. Но если они не могут видеть класс, чтобы расширить его, тогда вы в безопасности (r).

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