1. Пакеты
В стандартных Java-программах очень много классов. Сколько? Тысячи, десятки тысяч. А если еще посчитать, что программа использует различные библиотеки, которые содержат классы, написанные другими программистами, то количество классов легко может исчисляться миллионами!
Для всех этих миллионов, да и просто тысяч классов невозможно придумать уникальные имена.
Нет, ну конечно можно придумать имена типа А123
, Б345
, но если мы говорим о выборе для каждого класса хорошего имени, которое облегчает понимание этого класса (как String
для строк, например), то даже тысяча уникальных имен — это большой труд.
Поэтому в Java все классы сгруппированы по пакетам.
Классы и их пакеты в Java по своей сути очень напоминают файлы и папки на компьютере.
Например, если вам нужно хранить на компьютере 10 документов, вы скорее всего просто будете хранить их в одной папке. А если документов тысячи (например, хранилище всех документов компании)?
Если бы нужно было хранить тысячи документов, решением было бы разработать несколько уровней папок с хорошими говорящими названиями. И в папке самого последнего уровня хранить документы, которые относятся к этой конкретной папке. Хорошие говорящие названия для документов тоже не помешают.
Фактически в Java это все и было сделано для классов.
Файлы с классами хранятся в разных директориях (папках), и полное название папки класса со всеми подпапками называется пакетом класса. Пример:
Путь к файлу | Имя пакета | Имя класса |
---|---|---|
|
|
|
|
|
|
|
|
|
Имя пакета, в отличие от имени папки, пишется через точку. Т.е. если папка была \com\javarush\tasks\
, ей будет соответствовать пакет com.javarush.tasks
.
2. Папка src
В Java принято все классы одной программы хранить в одной папке (и ее подпапках). Такую папку обычно называют src
(сокращение от source).
Такая папка называется корнем проекта (source root), и все пути для пакетов считаются от нее. Примеры:
Папки | Имя пакета |
---|---|
|
|
|
|
Программисты в такой ситуации скажут что-то типа «у нас есть проект по имени my
, который расположен в папке c:\projects\data
» или «у нас есть проект по имени project
, который расположен в папке d:\files\git\data
»
Лучше всегда класть классы в пакеты, а не в корень папки src
. Когда классов мало, это ещё не проблема, но когда классов много, очень легко запутаться. Поэтому всегда создавайте классы только в пакетах.
В Java принято давать классам и пакетам осмысленные имена. Многие компании выпускают свои библиотеки (набор классов) и, чтобы не было путаницы, называют пакеты этих классов по имени компании/сайта/проекта:
Имя пакета | Имя компании/проекта |
---|---|
|
Проект «Apache» |
|
Компания «Oracle» |
|
Компания Oracle, проект Java |
|
Компания «IBM», проект WebSphere |
|
Проект «Jboss» |
3. Содержимое файла
Согласно стандарту языка Java, внутри файла с кодом должна быть записана информация об имени класса и имя его пакета. Схема стандарта приведена ниже:
package имя-пакета;
public class Имя-класса
{
}
Имя пакета должно совпадать с именем папки, а имя файла — с именем публичного класса.
Если у вас есть файл ...\src\com\project\Service.java
, значит у него внутри должно быть записано:
package com.project;
public class Service
{
}
4. Импорт классов
Имя класса + имя пакета формируют так называемое полное уникальное имя класса.
Примеры:
Полное уникальное имя | Имя пакета | Имя класса |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
отсутствует |
|
Хорошая новость:
Полное имя класса всегда уникально в рамках одного проекта. Ну вы же не можете создать два файла с одним и тем же именем в одной и той же папке.
Плохая новость:
Полные имена классов обычно либо длинные, либо очень длинные. А ведь каждый раз писать в коде длинное имя, например 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
, импортировать их оба в один файл с кодом не получится: для второго постоянно придется использовать длинное имя.
Допустим, у вас в коллективе есть Серега, и никаких проблем с общением, не возникает — все знают кто это. Но если бы их было трое, чтобы их различать, пришлось бы использовать полные уникальные имена.
Кстати, если вам лень добавлять много импортов в ваш класс, вы можете воспользоваться его версией для ленивых: вместо имени класса поставить звездочку:
import имя-пакета.*;
Таким образом, вы сможете использовать в вашем коде короткие имена всех классов из данного пакета.
Все классы из пакета java.lang
импортируются автоматически, поэтому вам не нужно писать для них import
. Один такой класс вы точно знаете: это класс... java.lang.String
. Да, да, тот самый класс String
, который используется для работы со строками.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ