1. Папка src — де живе ваш код
Якби Java‑проєкт був будинком, то папка src — це затишна вітальня, де збираються всі основні мешканці (ваші класи). Саме сюди розміщують усі вихідні файли з кодом — не в корінь проєкту, не в папку з налаштуваннями і не на робочий стіл (навіть якщо дуже хочеться).
Чому відділяти вихідний код від усього іншого?
- У папці
srcзберігаються лише файли, які ви пишете вручну: .java. - Усе, що зʼявляється під час збирання (наприклад, .class-файли, тимчасові файли), зберігається в інших папках (out, build, target тощо).
- Це полегшує навігацію, робить проєкт чистішим, а IDE — щасливішою.
Приклад структури простого проєкту:
MyFirstProject/
├── .idea/ # службові файли IntelliJ IDEA, не чіпаємо
├── out/ # тут зʼявляються скомпільовані .class‑файли
├── src/ # ось тут живе ваш вихідний код!
│ └── Main.java
├── MyFirstProject.iml
└── README.md
Важливо:
Усе, що ви пишете самі — класи, пакети, інтерфейси — має бути в папці src. Не кладіть туди картинки, музику й секретні рецепти — для цього є інші папки.
2. Пакети package
У Java прийнято групувати класи в пакети — це як папки у файловій системі, тільки для класів. Пакети допомагають:
- Уникнути конфліктів імен: якщо в проєкті два класи
Main— у різних пакетах вони не заважатимуть одне одному. - Логічно структурувати код (наприклад,
com.javarush.tasks,com.mycompany.utils). - Керувати доступом до класів і методів.
Синтаксис оголошення пакета
На початку кожного Java‑файлу (до всіх import і class) пишеться рядок:
package com.javarush.lesson05;
Це означає: клас із цього файлу належить пакету com.javarush.lesson05.
Важливо:
Папки у файловій системі мають збігатися з іменем пакета! Якщо у вас зазначено package com.javarush.lesson05;, то шлях до файлу буде:
src/com/javarush/lesson05/Main.java
Як створити пакет у IntelliJ IDEA
- У панелі проєкту натисніть правою кнопкою миші на папці
src. - Виберіть New → Package.
- Введіть імʼя, наприклад: com.javarush.lesson05 (IDE сама створить вкладені папки).
- Тепер створіть новий клас усередині цього пакета. Натисніть правою кнопкою миші на папці com.javarush.lesson05 і виберіть New → Java Class. Введіть його імʼя.
Приклад:
src/
└── com/
└── javarush/
└── lesson05/
└── User.java
Чому не можна просто складати все в src?
Якщо покласти всі класи впереміш, проєкт швидко перетвориться на «звалище», де знайти потрібний файл буде складніше, ніж знайти зарядку для ноутбука в студентському гуртожитку. Використовуйте пакети — так буде простіше масштабувати проєкт, під’єднувати сторонні бібліотеки й ділити код між різними командами.
3. Повне імʼя класу
Кожен клас у Java обовʼязково перебуває в якомусь пакеті. Пакет — це просто «папка» всередині бібліотеки класів. Наприклад:
- Клас System лежить у пакеті java.lang. Його повне імʼя — java.lang.System.
- Клас Scanner лежить у пакеті java.util. Його повне імʼя — java.util.Scanner.
- Клас ArrayList теж у java.util, тож повне імʼя — java.util.ArrayList.
Тобто повне імʼя класу = імʼя пакета + крапка + імʼя класу.
Спробуймо використати це в коді:
java.util.Scanner sc = new java.util.Scanner(System.in);
String name = sc.nextLine();
System.out.println("Привіт, " + name);
Тут ми явно пишемо java.util.Scanner. Компілятор розуміє, про який саме клас ідеться, навіть якщо в програмі є інші класи з імʼям Scanner.
Це дуже важливо: імʼя класу може збігатися, але повне імʼя завжди унікальне.
Навіщо взагалі потрібне повне імʼя?
Уявіть, що в нас є два різні класи Date:
- java.util.Date (старий клас для роботи з датами),
- java.sql.Date (дата для роботи з базами даних).
Якщо ви просто напишете:
Date d = new Date();
Компілятор не зрозуміє, який саме Date ви хочете використати. Але якщо написати повне імʼя:
java.util.Date d1 = new java.util.Date();
java.sql.Date d2 = new java.sql.Date(System.currentTimeMillis());
— плутанини не буде.
4. Оператор import
Щоразу писати повне імʼя класу незручно. Саме для цього в Java існує оператор import.
Якщо ми пишемо:
import java.util.Scanner;
Це означає: «У цій програмі я буду використовувати клас Scanner із пакета java.util». Після цього можна писати просто:
Scanner sc = new Scanner(System.in);
І компілятор зрозуміє, що йдеться саме про java.util.Scanner.
Звичайний import (один клас)
Це найпоширеніший варіант. Ми вказуємо конкретний клас:
import java.util.Scanner;
import java.util.ArrayList;
Тепер можна писати короткі імена: Scanner, ArrayList.
Імпорт усього пакета *
Іноді в програмі використовується багато класів з одного пакета. Тоді можна написати:
import java.util.*;
Це означає: «Дозволити використовувати всі класи з пакета java.util без повного імені».
Тепер можна писати:
Scanner sc = new Scanner(System.in);
ArrayList<String> list = new ArrayList<>();
Але важливо памʼятати: import java.util.*; імпортує лише класи з пакета java.util, але не з підпакетів. Наприклад, клас java.util.concurrent.ConcurrentHashMap сюди не потрапить. Його треба імпортувати окремо.
Що не можна зробити з import
importне можна використовувати всередині методу — він пишеться тільки на початку файлу.importне завантажує класи в памʼять. Він лише каже компілятору, звідки брати клас.importне може замінити повне імʼя, якщо є два класи з однаковими іменами.
5. Classpath — як Java шукає ваші класи
Classpath — це «маршрут», за яким Java шукає ваші класи, коли запускає програму. Можна уявити це як список папок, де Java шукатиме потрібні .class-файли (скомпільовані версії ваших .java).
За замовчуванням IDE сама додає папку src (або папку зі скомпільованими класами, наприклад, out/production/ProjectName) до classpath. Тобто якщо ви написали клас у пакеті com.javarush.lesson05, Java шукатиме його за шляхом:
out/production/ProjectName/com/javarush/lesson05/Main.class
Як працює classpath у IntelliJ IDEA?
- Коли ви запускаєте програму через IDE, вона автоматично підставляє потрібний classpath.
- Якщо ви запускаєте програму з командного рядка, треба явно вказати classpath за допомогою прапорця -cp або -classpath.
- Усі класи з вашого проєкту й під’єднаних бібліотек мають бути в папках, які зазначені в classpath.
6. Організація коду в проєкті
Один клас — один файл
У Java прийнято, щоб кожен public-клас був в окремому файлі, який називається так само, як і сам клас. Наприклад, якщо у вас клас Person, то файл має називатися Person.java.
Приклад:
src/com/javarush/lesson05/Person.java
package com.javarush.lesson05;
public class Person {
String name;
}
Імена файлів і класів мають збігатися
Якщо клас називається MySuperClass, то файл має бути MySuperClass.java. Це не просто забаганка, а вимога компілятора Java. Якщо переплутати — отримаєте помилку на етапі компіляції.
Де зберігати ресурси (картинки, текстові файли)?
- Для ресурсів зазвичай створюють окрему папку, наприклад, resources або res.
- У IntelliJ IDEA можна додати таку папку через правий клік на папці: Mark Directory as → Resources Root.
- Java‑код може звертатися до цих файлів через
classpath.
Приклад структури:
MyFirstProject/
├── src/
│ └── com/javarush/lesson05/
│ └── Main.java
├── resources/
│ └── config.txt
7. Типові помилки під час роботи зі структурою проєкту
Невідповідність структури папок і пакета
Якщо на початку файлу написано package com.javarush.lesson05;, а файл лежить у src/Main.java, компілятор видасть помилку «package does not exist» або «class not found». Завжди стежте, щоб папки відповідали імені пакета!
Невідповідність імені файлу й класу
Якщо клас називається Person, а файл — People.java, отримаєте «class Person is public, should be declared in a file named Person.java».
Ручне переміщення файлів без оновлення пакета
Якщо ви перемістили файл в іншу папку, але забули змінити рядок package, програма не скомпілюється. Робіть це у вікні Project в IDE — вона сама оновить package!
Ресурси не додані в classpath
Якщо ви зберігаєте файли (наприклад, текстові) поза папкою resources і не позначили папку як Resources Root, програма не зможе їх знайти через classpath.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ