Java 8

8. ПАКЕТИ І ІНТЕРФЕЙСИ

Пакет (package) - це якийсь контейнер, який використовується для того, щоб ізолювати імена класів. Наприклад, ви можете створити клас List, укласти його в пакет і не думати після цього про можливі конфлікти, які могли б виникнути, якби хто-небудь ще створив клас з ім'ям List.

Інтерфейс - це явно зазначена специфікація набору методів, які повинні бути представлені в класі, який реалізує цю специфікацію. Реалізація ж цих методів в інтерфейсі відсутній. Подібно абстрактним класах інтерфейси володіють чудовою додатковим властивістю - їх можна багаторазово успадковувати. Конкретний клас може бути спадкоємцем лише одного суперкласу, але зате в ньому може бути реалізовано необмежену кількість інтерфейсів.

8.1. пакети

Всі ідентифікатори, які ми досі використовували в наших прикладах, розташовувалися в одному і тому ж просторі імен (name space). Це означає, що нам, щоб уникнути конфліктних ситуацій доводилося піклуватися про те, щоб у кожного класу було своє унікальне ім'я. Пакети - це механізм, який служить як для роботи з простором імен, так і для обмеження видимості. У кожного файлу java є 4 внутрішніх частини, з яких ми до сих пір в наших прикладах використовували тільки одну. Нижче наведена загальна форма вихідного файлу Java.

8.1.1. оператор package

Перше, що може з'явитися в вихідному файлі Java - це оператор package, який повідомляє транслятор, в якому пакеті повинні визначатися містяться в цьому файлі класи. Пакети задають набір роздільних просторів імен, у яких зберігаються імена класів. Якщо оператор package не вказано, класи потрапляють в безіменне простір імен, що використовується за умовчанням. Якщо ви повідомляєте клас як належить певному пакету, наприклад, packagejava.awt.image;

то і вихідний код цього класу повинен зберігатися в каталозі java / awt / image.

8.1.2. Трансляція класів в пакетах

При спробі помістити клас в пакет ви відразу натрапите на жорстку вимогу точного збігу ієрархії каталогів з ієрархією пакетів. Ви не можете перейменувати пакет, що не перейменувавши каталог, в якому зберігаються його класи. Ця трудність видно відразу, але є і менш очевидна проблема. Уявіть собі, що ви написали клас з ім'ям PackTest в пакеті test. Ви створюєте каталог test, ставите в цей каталог файл PackTest.java і транслюєте. Поки - все в порядку. Однак при спробі запустити його ви отримуєте від інтерпретатора повідомлення «can not find class PackTest» ( «Не можу знайти клас PackTest»). Ваш новий клас тепер зберігається в пакеті з ім'ям test, так що тепер треба вказувати всю ієрархію пакетів, розділяючи їх імена точками - test.PackTest. Крім того, Вам треба або піднятися на рівень вище в ієрархії каталогів і знову набрати «java test.PackTest», або внести в змінну CLASSPATH каталог, який є вершиною ієрархії розробляються вами класів.

8.1.3. оператор import

Після оператора package, але до будь-якого визначення класів у вихідному Java-файлі, може бути присутнім список операторів import. Пакети є хорошим механізмом для відділення класів один від одного, тому всі вбудовані в Java класи зберігаються в пакетах. Загальна форма оператора import така:

importпакет1 [.пакет2]. (імякласса | *);

import javautil.Date
import javaio. *;

Всі вбудовані в Java класи, які входять в комплект поставки, зберігаються в пакеті з ім'ям java. Базові функції мови зберігаються у вкладеному пакеті java.lang. Весь цей пакет автоматично імпортується транслятором в усі програми. Це еквівалентно розміщення на початку кожної програми оператора import java.lang. *;

Якщо в двох пакетах, що підключаються за допомогою форми оператора import із зірочкою, є класи з однаковими іменами, проте ви їх не використовуєте, транслятор не відреагує. А ось при спробі використовувати такий клас ви відразу отримаєте повідомлення про помилку, і вам доведеться переписати оператори import, щоб явно вказати, клас якого пакета ви маєте на увазі, classMyDateextendsJava.util.Date<>

8.1.4. Обмеження доступу

1. підкласи в тому ж пакеті;

2. З підкласи в тому ж пакеті;

3. підкласи в різних пакетах;

4. класи, які не є підкласами і не входять в той же пакет.

У мові Java є три рівня доступу, що визначаються ключовими словами: private (закритий), public (відкритий) і protected (захищений), які вживаються в різних комбінаціях. Вміст елементів таблиці визначає доступність змінної з даної комбінацією модифікаторів (стовпець) із зазначеного місця (рядок).

Є кілька правил, які допоможуть вам розібратися. Елемент, оголошений public, доступний з будь-якого місця. Все, що оголошено private, є тільки всередині класу і ніде більше. Якщо у елемента взагалі не вказано модифікатор рівня доступу, то такий елемент буде видно з підкласів і класів того ж пакета. Саме такий рівень доступу використовується в мові Java за замовчуванням. Якщо необхідно, щоб елемент був доступний тільки подклассам, причому незалежно від того, чи знаходяться вони в даному пакеті чи ні - використовуйте protected.

Таблиця 8.1 Таблиця обмеження доступу

Схожі статті