2010-03-10 4 views
2

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

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

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

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

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

+0

Я думаю, что вы имели в виду «внутри одного пакета», а не «в пределах одного класса» в первом абзаце. –

+0

@ Jon Skeet, вы правы. Спасибо за комментарий. – Roman

ответ

5

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

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

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

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

Есть короткая заметка о видимости в Sun's tutorial. Также обратитесь к разделу о вложенных классах.

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

+0

Xr, но в первом случае видимость поля переопределяет видимость класса. Поле private-private и class является общедоступным, и в результате поле отображается только из «родного» пакета. – Roman

+0

Правильно. Фактически, это самый ограничительный вариант. Я испортил первое предложение (исправил его), но остальная часть моего ответа по-прежнему сохраняется. –

+0

+1 для обозначения синтетических аксессуаров. – mtsz

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

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

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

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

+0

Итак, если класс является «общедоступным», все поля потенциально общедоступны, и поле будет действительно общедоступным, если мы будем использовать «публичный» модификатор перед этим полем. Если класс является приватным пакетом, то модификатор поля не имеет никакого смысла (без использования какого-либо модификатора поля, это поле всегда должно быть private-package). – Roman

+0

Да для «потенциально открытой» части. Нет для пакета-частного. В этом случае «защищенные» и «частные» по-прежнему сохраняют свое значение. –

+0

Правильно. Во втором случае поле может быть частным или частным, конечно. –

1

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

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

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

Смежные вопросы