Уровни доступа членов класса Java - PullRequest
6 голосов
/ 21 января 2009

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

Означает ли это, что невозможно объявить поле, которое доступно только унаследованным классам, а не другим не наследуемым классам в одном пакете?

Я ценю, что есть способы обойти это, но есть ли случаи, когда вы хотели бы иметь такое поведение?

Очевидно, что вышеупомянутый вопрос относится как к методам, так и к полям.

Большое спасибо.

Ответы [ 3 ]

11 голосов
/ 21 января 2009

См .: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html
Пакет> Подклассы, вы никогда не можете иметь поле, видимое только подклассами, но не классами из того же пакета.

3 голосов
/ 21 января 2009

В основном:

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

больше информации здесь .

2 голосов
/ 21 января 2009

Да, защищенный доступ Java немного странен в этом смысле. Я не могу сразу понять, почему это вообще желательно. Лично меня это не беспокоит для полей , так как я все равно не люблю не приватные поля (кроме констант), но то же самое верно и для других членов.

.NET вообще не имеет понятия видимости доступа к пакету / пространству имен, но у него есть альтернатива - сборка (подумайте «файл jar» - не совсем то же самое, но близко). Честно говоря, я бы хотел иметь опции видимости пространства развертывания и , но, похоже, я обречен на разочарование ...

...