1. Пакети

У стандартних Java-програмах дуже багато класів. Скільки? Тисячі, десятки тисяч. А якщо врахувати ще використання програмою різних бібліотек, які містять класи, написані іншими програмістами, то кількість класів легко може сягнути мільйонів!

Для всіх цих мільйонів, та й для тисяч класів неможливо придумати унікальні імена.

Ні, звісно, можна створити імена на кшталт А123, Б345, але якщо ми говоримо про вибір для кожного класу гарного імені, що сприятиме розумінню цього класу (як-от String для рядків, приміром), то навіть тисяча унікальних імен — це велика праця.

Тому в Java всі класи згруповано в пакети.

Класи та їх пакети в Java за своєю сутністю дуже нагадують файли і папки на комп'ютері.

Наприклад, якщо вам потрібно зберігати на комп'ютері 10 документів, ви, найімовірніше, просто зберігатимете їх в одній папці. А якщо документів тисячі (наприклад, сховище всіх документів компанії)?

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

На практиці в Java це все й було зроблено для класів.

Файли з класами зберігаються в різних директоріях (папках), і повна назва папки класу з усіма підпапками називається пакетом класу. Приклад:

Шлях до файлу Ім’я пакету Ім’я класу
\com\javarush\tasks\Solution.java
com.javarush.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

Ім'я пакету, на відміну від імені папки, пишеться через крапку. Тобто якщо папка була \com\javarush\tasks\, їй відповідатиме пакет com.javarush.tasks.


2. Папка src

У Java прийнято всі класи однієї програми зберігати в одній папці (та її підпапках). Такій папці зазвичай дають ім'я src (скорочення від source).

Така папка називається коренем проєкту (source root), і всі шляхи для пакетів починають відлік від неї. Приклади:

Папки Ім’я пакету
c:\projects\data\my\src\com\javarush\tasks\
com.javarush.tasks
d:\files\git\data\project\src\com\javarush\tasks\
com.javarush.tasks

Програмісти в такій ситуації скажуть щось на кшталт: «У нас є проєкт на ім'я my, розміщений у папці c:\projects\data» або «У нас є проєкт на ім'я project, розміщений у папці d:\files\git\data».

Краще завжди вкладати класи в пакети, а не в кореневу папку src проєкту. Коли класів мало, це не є проблемою, але коли класів багато, дуже легко заплутатися. Тому завжди створюйте класи лише в пакетах.

У Java прийнято давати класам і пакетам осмислені імена. Багато компаній випускають свої бібліотеки (набір класів) і, щоб уникнути плутанини, називають пакети цих класів за іменем компанії/сайту/проєкту:

Ім’я пакету Ім'я компанії/проєкту
org.apache.common
org.apache.tomcat
org.apache.util
Проєкт «Apache»
com.oracle.jdbc
Компанія Oracle
java.io
javax.servlet
Компанія Oracle, проєкт Java
com.ibm.websphere
Компанія IBM, проєкт WebSphere
com.jboss
Проєкт «Jboss»

3. Вміст файлу:

Відповідно до стандарту мови Java, всередині файлу з кодом має бути записана інформація про ім'я класу та ім'я його пакету. Схему стандарту наведено нижче:

package ім'я-пакету;

public class Ім'я-класу
{

}

Ім'я пакету має збігатися з іменем папки, а ім'я файлу — з іменем публічного класу.

Якщо у вас є файл ...\src\com\project\Service.java, то в ньому має бути записано:

package com.project;

public class Service
{

}

4. Імпортування класів

Ім'я класу + ім'я пакету утворюють так зване повне унікальне ім'я класу.

Приклади:

Повне унікальне ім'я Ім’я пакету Ім’я класу
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
немає
Cat

Добра новина:

Повне ім'я класу завжди є унікальним у межах одного проєкту. Адже ви не можете створити в одній папці два файли з однаковими іменами.

Погана новина:

Повні імена класів зазвичай або довгі, або дуже довгі. Але щоразу писати в коді довге ім'я, наприклад java.util.ArrayList, дуже незручно.

Тому в Java додали можливість «імпортувати класи».

Ви можете використовувати в своєму коді коротке ім'я класу, але спочатку потрібно пояснити компілятору, яке саме «повне унікальне ім'я класу» відповідає короткому імені. Адже, можливо, у вашому проєкті декілька класів з таким іменем. Або спочатку був один, а потім додалося ще 15…

Щоб використовувати у своєму коді коротке ім'я класу, вам слід додати в код отаку конструкцію:

import повне-унікальне-ім'я-класу;

Додавати таке оголошення потрібно напочатку класу відразу після оголошення package.

Приклад:

package com.javarush.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

Завдяки тому, що ми імпортували два класи, java.util.Scanner і com.test.helper.special.ArrayList, можна використовувати їхні короткі імена в нашому коді. І компілятор знатиме, про які саме класи йдеться.

А от який вигляд мав би цей самий код, якби ми не використовували import:

package com.javarush.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

До речі, якщо у вашому проєкті є два класи з іменем Scanner, імпортувати їх обидва в один файл із кодом не вийде: для другого постійно доведеться використовувати довге ім'я.

Припустімо, у вашому колективі є Павло і ніяких проблем зі спілкуванням не виникає — всі знають, хто це. Але якби їх було троє, щоб їх розрізняти, довелося б використовувати повні унікальні імена.

Примітка 1

До речі, якщо вам ліньки додавати багато імпортів у свій код, можна скористатися версією імпортування для ледачих — замість імені класу поставити зірочку:

import ім'я-пакету.*;

У такому разі ви зможете використовувати в коді короткі імена всіх класів із цього пакету.

Примітка 2

Усі класи з пакету java.lang імпортуються автоматично, тому немає потреби писати для них import. Один такий клас ви точно знаєте: це клас… java.lang.String. Так-так, той самий клас String, який використовують для роботи з рядками.


9
Задача
Java Syntax Zero,  9 рівень3 лекція
Недоступна
Імпорти: Part 1
У класі Solution заміни в коді всі короткі імена класів на повні.
9
Задача
Java Syntax Zero,  9 рівень3 лекція
Недоступна
Імпорти: Part 2
У класі Solution заміни в коді всі повні імена класів на короткі.