OpenU.Ru
Зависимость, разрешающая одному пакету
ссылаться на элементы другого пакета.
См. friend; import; visibility.
Семантика
Пакет (клиент), ссылающийся на элемент в другом пакете
(поставщик), должен импортировать пакет, содержащий
этот элемент. При этом между пакетом-клиентом и пакетом-поставщиком существуют
отношения зависимости access или import. Вложенный
пакет получает неявный доступ ко всем другим пакетам, импортированным его контейнером.
Другими словами, вложенный пакет имеет доступ ко всему, к чему имеет доступ
его пакет-контейнер.
Элемент пакета имеет доступ ко всем элементам, которые
видимы в рамках этого пакета. Правила видимости можно описать следующим образом:
Из этих правил следует, что пакет не может "видеть" содержимое собственных
вложенных пакетов, если только он не имеет к ним явного доступа или если их
содержимое не имеет открытую видимость.
Существует еще несколько правил видимости:
Эти правила подразумевают, что все элементы, находящиеся в различных пакетах, равноправны. В этом случае элемент может видеть все элементы своего пакета и все элементы, обладающие открытой видимостью в импортированных пакетах. Класс может "видеть" открытые элементы других видимых классов. Кроме того, он "видит" защищенные элементы классов-предков.
Нотация
Зависимость доступа изображается в виде пунктирной стрелки, наконечник которой расположен у пакета-клиента, а хвост - у пакета-поставщика. Стрелка должна быть помечена с помощью ключевого слова "access".
Обсуждение
На рис. 5 изображены отношения одноуровневого доступа между двумя пакетами. Пакет Р имеет доступ к пакету Q, при этом пакет Q не имеет доступа к пакету Р. Классы К и L в пакете Р могут "видеть" открытый класс М в пакете Q, но не закрытый класс N. Ни класс М. ни класс N не могут "видеть" классы пакета Р (даже класс К, обладающий открытой видимостью), так как у пакета Q нет доступа к пакету Р. Для того, чтобы класс был видимым для другого равно-уровневого пакета, он должен обладать открытой видимостью, а содержащий его пакет должен либо быть импортирован, либо доступен для другого пакета.
Рис. 5. Одноуровневый доступ
На рис. 6 вы видите уже более сложный пример для видимости и отношений доступа.
Символы возле названий элементов указывают на тип видимости, которым обладает
этот элемент (+ - открытый элемент, и # - защищенный, то есть видимый только
потомкам, - - закрытый, то есть вообще невидимый вне своего пакета).
Рис. 6. Отношения доступа
Класс А "видит" класс С и класс Е, потому что они находятся в его
пакетах-контейнерах (Y и X).
Классы С и А "видят" класс D, потому что пакет Y импортирует пакет
Z. Класс А вложен в пакет Y, поэтому может "видеть" все то же, что
и он.
Классы А, С и Е "видят" класс В, потому что они вложены в пакет X,
импортирующий пакет V, в котором содержится класс В. В то же время они не "видят"
класс F, так как он, хотя и содержится в пакете V, обладает закрытой видимостью.
Таким образом, класс К невидим за пределами пакета V.
Класс Е не может "видеть" класс D, так как тот находится в пакете
Z, который не был импортирован пакетом X.
Класс С и класс Е не "видят" класс А, так как он находится и пакете
U, который не был импортирован другими пакетами.
Классы В и F "видят" классы D и Е, так как те находятся в пакетах-контейнерах.
Кроме того, они "видят" класс С из пакета Y, который был импортирован
классом-контейнером X. Класс F обладает закрытой видимостью, но это не мешает
ему "видеть" другие классы. Те - же, напротив, его не "видят".
Классы В и Р "видят" друг друга, так как они находятся в одном пакете.
Закрытым класс F является только для "чужих" пакетов, но не для элементов
своего собственного пакета.