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
8. Типичные ошибки при работе со структурой проекта
Несовпадение структуры папок и пакета
Если в начале файла написано 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.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ