Пакети класів, package

Пакет package дозволяє логічно об'єднати класи в набори. Основні класи java входять в пакет java.lang. Різні допоміжні класи розташовуються в пакеті в java.util. Класи для введення і виведення входять в пакет java.io, а класи для роботи в мережі - в java.net. Деякі з цих пакетів містять підпакети. Так, наприклад, java.lang містить два спеціалізованих пакета java.lang.reflect і java.lang.ref, а java.util містить підпакету java.util.zip, який включає класи для роботи з ZIPархівамі.

Кожен клас має як просте ім'я, дане йому в визначенні, так і повне ім'я, яке включає ім'я пакета, до якого він входить. Наприклад, клас String є частиною пакета java.lang, а його повне ім'я - java.lang.String.

Структура пакетів в точності відображає структуру файлової системи. Всі файли з вихідними кодами (java-клас) і байт-кодами (розширенням class), що утворюють один пакет, зберігаються в одному каталозі файлової системи. Підпакети утворюють підкаталоги цього каталогу. Кожен пакет створює єдиний простір імен namespace. Це означає, що всі імена класів і інтерфейсів в пакеті повинні бути унікальні. Імена в різних пакетах можуть збігатися, але це будуть різні програмні модулі. Організація класів у вигляді пакетів дозволяє уникнути конфлікту імен між класами. У пакеті дублювання імен класів не допускається. Належність класу до пакету дозволяє гарантувати однозначність імен.

Щоб вказати, що клас належить певному пакету, слід використовувати директиву package. після якої вказується найменування (шлях) пакета:

В даному прикладі клас HelloWorld розташовується в пакеті company.common. Фізично це директорія «$ / company / common». При створенні класу в середовищі розробки IDE (наприклад, Eclipse) слід вказати найменування пакету, тоді IDE самостійно при необхідності створить каталог на жорсткому диску і розмістить новий клас в цьому каталозі.

Можна package в класі не визначати. В цьому випадку клас буде знаходитися в пакеті за замовчуванням, який не має під іменем "$", тобто клас буде розташовуватися в кореневій директорії вихідних кодів проекту.

Найменування пакета може бути будь-яким, але необхідно дотримуватися його унікальність в проекті. Угода «Code Conventions» рекомендує записувати імена пакетів малими літерами. Тоді вони не будуть збігатися з іменами класів, які, за угодою, починаються з великої літери.

Стандартна бібліотека Java API включає сотні класів. Кожен програміст в ході роботи створює десятки своїх класів. Безліч класів швидко збільшується. Java дозволяє окремі класи, вирішальні певне завдання (або кілька завдань), об'єднувати в бібліотеки класів у вигляді архівів jar. Але ці бібліотеки класів, крім стандартних, не є частиною мови java.

Імпорт пакетів і класів, import

Для використання класу в додатку, його слід підключити. Так розташований в пакеті java.util клас Scanner можна приєднати його наступним способом:

У цьому прикладі при визначенні / створенні нового об'єкта був вказує пакет (повний шлях до файлу). Однак даний підхід не завжди зручний, і в якості альтернативи можна імпортувати пакети і класи в програму за допомогою директиви import. яка вказується після директиви package:

Директива import вказується на самому початку коду, після чого йде ім'я підключається класу (клас Scanner в прикладі).

У прикладі був підключений тільки один клас. Однак пакет java.util містить велику кількість різних класів. І щоб не підключати окремо кожен клас, можна відразу підключити весь пакет:

Тепер можна використовувати будь-який клас з пакета java.util.

Можлива ситуація, коли використовується два класи з однаковим найменуванням, але з різних пакетів. Це відноситься, наприклад, до класів Date. які є в пакеті java.util і в пакеті java.sql. або класами List пакетів java.util і java.awt. І якщо необхідно одночасно використовувати обидва ці класу, то необхідно вказувати повний шлях до класів в пакеті:

Слід сказати, що основні класи з пакета java.lang (наприклад, String) підключаються автоматично і не вимагають «імпортування».

Статичний імпорт класів, import static

У java можна використовувати статичний імпорт. Для цього разом з директивою import використовується модифікатор static:

У прикладі визначається статичний імпорт класів System і Math. які мають статичні методи. Визначення статичного імпорту дозволяє використовувати статичні методи без назви класу. У прикладі статична функція sqrt (20) (можна і Math.sqrt (20)), повертає квадратний корінь числа. Те ж саме відноситься і до класу System. в якому визначено статичний об'єкт out. тому можна його використовувати без вказівки класу, якщо виконано статичний імпорт класу System.

Приклад використання класів різних пакетів

Розглянемо простенький проект PackageExample, що включає 3 java-класу. Два java-класу розташовуються в одному пакеті «ru.java.online», а третій - в іншому «ru.java.online.classes». Структура проекту представлена ​​на наступному скріншоті:

Пакети класів, package

Лістинг базового класу, BaseClass.java

Базовий клас включає 2 поля (id, name) і методи get / set. У конструкторі значення полів инициализируется.

Перевизначена функція toString () повертає найменування класу і значення полів.

Лістинг спадкоємця, Inheritor.java

Клас Inheritor.java успадковує властивості базового класу BaseClass.java. Оскільки класи располаются в різних пакетах, то базовий клас необхідно імпортувати.

Лістинг основного класу, MainPackage.java

Основний клас включає статичний метод main. Оскільки даний клас не "бачить" спадкоємця, то його доводиться імпортувати.

Результат виконання даної програми виводиться в консоль в наступному вигляді:

Як видно з результату виконання програми найменування класу включає пакет.

Говорячи про повне найменування класу слід відзначити, що воно включає не тільки найменування пакету і найменування класу, але також і клас-завантажувач classloader. Детально про класи-завантажувач можна почитати тут.