What Is a Package?
A package is a namespace that organizes a set of related classes and interfaces. Conceptually you can think of packages as being similar to different folders on your computer. You might keep HTML pages in one folder, images in another, and scripts or applications in yet another. Because software written in the Java programming language can be composed of hundreds or thousands of individual classes, it makes sense to keep things organized by placing related classes and interfaces into packages.
The Java platform provides an enormous class library (a set of packages) suitable for use in your own applications. This library is known as the "Application Programming Interface", or "API" for short. Its packages represent the tasks most commonly associated with general-purpose programming. For example, a String object contains state and behavior for character strings; a File object allows a programmer to easily create, delete, inspect, compare, or modify a file on the filesystem; a Socket object allows for the creation and use of network sockets; various GUI objects control buttons and check boxes and anything else related to graphical user interfaces. There are literally thousands of classes to choose from. This allows you, the programmer, to focus on the design of your particular application, rather than the infrastructure required to make it work.
The Java Platform API Specification contains the complete listing for all packages, interfaces, classes, fields, and methods supplied by the Java SE platform. Load the page in your browser and bookmark it. As a programmer, it will become your single most important piece of reference documentation.
Packages in Java: How to Create and Use Packages in Java?
![]()
One of the most innovative Packages in Java are a way to encapsulate a group of classes, interfaces, enumerations, annotations, and sub-packages. Conceptually, you can think of java packages as being similar to different folders on your computer. In this tutorial, we will cover the basics of packages in features of Java is the concept of packages. Java.
Listed below are the topics covered in this article:
- What is Package in Java?
2. Built-in Packages
3. User Defined Packages
- Creating a Package in Java
- Including a Class in Java Package
- Creating a class inside package while importing another package
- Using fully qualified name while importing a class
4. Static Import in Java
5. Access Protection in Java Packages
6. Points to Remember
What is Package in Java?
Java package is a mechanism of grouping similar types of classes, interfaces, and sub-classes collectively based on functionality. When software is written in the Java programming language, it can be composed of hundreds or even thousands of individual classes. It makes sense to keep things organized by placing related classes and interfaces into packages.
Using packages while coding offers a lot of advantages like:
- Re-usability: The classes contained in the packages of another program can be easily reused
- help us to uniquely identify a class, for example, we can have Name Conflicts: Packages company.sales.Employee and company.marketing.Employee classes
- Controlled Access: Offers access protection such as protected classes, default classes, and private class
- Data Encapsulation: They provide a way to hide classes, preventing other programs from accessing classes that are meant for internal use only
- Maintainance: With packages, you can organize your project better and easily locate related classes
It’s a good practice to use packages while coding in Java. As a programmer, you can easily figure out the classes, interfaces, enumerations, and annotations that are related. We have two types of packages in java.
Types of Packages in Java
Based on whether the package is defined by the user or not, packages are divided into two categories:
- Built-in Packages
- User-Defined Packages
Built-in Packages
Built-in packages or predefined packages are those that come along as a part of JDK (Java Development Kit) to simplify the task of Java programmer. They consist of a huge number of predefined classes and interfaces that are a part of Java API’s. Some of the commonly used built-in packages are java.lang, java.io, java.util, java.applet, etc. Here’s a simple program using a built-in package.
Output:
The ArrayList class belongs to java.util package. To use it, we have to import the package using the import statement. The first line of the code import java.util.ArrayList imports the java.util package and uses ArrayList class which is present in the subpackage util.
User-Defined Packages
User-defined packages are those which are developed by users in order to group related classes, interfaces, and sub-packages. With the help of an example program, let’s see how to create packages, compile Java programs inside the packages, and execute them.
Creating a Package in Java
Creating a package in Java is a very easy task. Choose a name for the package and include a package command as the first statement in the Java source file. The java source file can contain the classes, interfaces, enumerations, and annotation types that you want to include in the package. For example, the following statement creates a package named MyPackage.
The package statement simply specifies to which package the classes defined belongs to.
Note: If you omit the package statement, the class names are put into the default package, which has no name. Though the default package is fine for short programs, it is inadequate for real applications.
Including a Class in Java Package
To create a class inside a package, you should declare the package name as the first statement of your program. Then include the class as part of the package. But, remember that, a class can have only one package declaration. Here’s a simple program to understand the concept.
As you can see, I have declared a package named MyPackage and created a class Compare inside that package. Java uses file system directories to store packages. So, this program would be saved in a file as and will be stored in the directory named MyPackage. When the file gets compiled, Java will create a Compare.java .class file and store it in the same directory. Remember that name of the package must be same as the directory under which this file is saved.
You might be wondering how to use this Compare class from a class in another package?
Creating a class inside a package while importing another package
Well, it’s quite simple. You just need to import it. Once it is imported, you can access it by its name. Here’s a sample program demonstrating the concept.
Output:
I have first declared the package Edureka, then imported the class Compare from the package MyPackage. So, the order when we are creating a class inside a package while importing another package is,
- Package Declaration
- Package Import
Well, if you do not want to use the import statement, there is another alternative to access a class file of the package from another package. You can just use fully qualified name while importing a class.
Using fully qualified name while importing a class
Here’s an example to understand the concept. I am going to use the same package that I have declared earlier in the blog, MyPackage.
Output:
In the Demo class, instead of importing the package, I have used a fully qualified name such as MyPackage.Compare to create the object of it. Since we are talking about importing packages, you might as well check out the concept of static import in Java.
Static Import in Java
Static import feature was introduced in Java from version 5. It facilitates the Java programmer to access any static member of a class directly without using the fully qualified name.
Though using static import involves less coding, overusing it might make the program unreadable and unmaintainable. Now let’s move on to the next topic, access control in packages.
Access Protection in Java Packages
You might be aware of various aspects of Java’s access control mechanism and its access specifiers. Packages in Java add another dimension to access control. Both classes and packages are a means of data encapsulation. While packages act as containers for classes and other subordinate packages, classes act as containers for data and code. Because of this interplay between packages and classes, Java packages addresses four categories of visibility for class members:
- Sub-classes in the same package
- Non-subclasses in the same package
- Sub-classes in different packages
- Classes that are neither in the same package nor sub-classes
The table below gives a real picture of which type access is possible and which is not when using packages in Java:
We can simplify the data in the above table as follows:
- Anything declared public can be accessed from anywhere
- Anything declared private can be seen only within that class
- If access specifier is not mentioned, an element is visible to subclasses as well as to other classes in the same package
- Lastly, anything declared protected element can be seen outside your current package, but only to classes that subclass your class directly
This way, Java packages provide access control to the classes. Well, this wraps up the concept of packages in Java. Here are some points that you should keep in mind when using packages in Java.
Points to Remember
- Every class is part of some package. If you omit the package statement, the class names are put into the default package
- A class can have only one package statement but it can have more than one import package statements
- The name of the package must be the same as the directory under which the file is saved
- When importing another package, package declaration must be the first statement, followed by package import
Well, this brings us to the end of this ‘Packages in Java’ article. We learned what a package is and why we should use them. There is no doubt that the Java package is one of the most important parts for efficient java programmers. It not only upgrades the programmer’s coding style but also reduces a lot of additional work. If you wish to check out more articles on the market’s most trending technologies like Artificial Intelligence, DevOps, Ethical Hacking, then you can refer to Edureka’s official site.
Do look out for other articles in this series which will explain the various other aspects of Java.
Package в java что это

Как правило, в Java классы объединяются в пакеты. Пакеты позволяют организовать классы логически в наборы. По умолчанию java уже имеет ряд встроенных пакетов, например, java.lang , java.util , java.io и т.д. Кроме того, пакеты могут иметь вложенные пакеты.
Организация классов в виде пакетов позволяет избежать конфликта имен между классами. Ведь нередки ситуации, когда разработчики называют свои классы одинаковыми именами. Принадлежность к пакету позволяет гарантировать однозначность имен.
Чтобы указать, что класс принадлежит определенному пакету, надо использовать директиву package , после которой указывается имя пакета:
Как правило, названия пакетов соответствуют физической структуре проекта, то есть организации каталогов, в которых находятся файлы с исходным кодом. А путь к файлам внутри проекта соответствует названию пакета этих файлов. Например, если классы принадлежат пакету mypack, то эти классы помещаются в проекте в папку mypack.
Классы необязательно определять в пакеты. Если для класса пакет не определен, то считается, что данный класс находится в пакете по умолчанию, который не имеет имени.
Например, создадим в папке для исходных файлов каталог study . В нем создадим файл Program.java со следующим кодом:
Директива package study в начале файла указывает, что классы Program и Person, которые здесь определены, принадлежат пакету study.
Когда мы работаем в среде разработки, например, в Netbeans, то IDE берет на себя все вопросы компиляции пакетов и входящих в них файлов. Соответственно нам достаточно нажать на кнопку, и все будет готово. Однако если мы компилируем программу в командной строке, то мы можем столкнуться с некоторыми трудностями. Поэтому рассмотрим этот аспект.
Для компиляции программы вначале в командной строке/терминале с помощью команды cd перейдем к папке, где находится каталог study.
Например, в моем случае это каталог C:\java (то есть файл с исходным кодом расположен по пути C:\java\study\Program.java).
Для компиляции выполним команду
После этого в папке study появятся скомпилированные файлы Program.class и Person.class. Для запуска программы выполним команду:

Импорт пакетов и классов
Если нам надо использовать классы из других пакетов, то нам надо подключить эти пакеты и классы. Исключение составляют классы из пакета java.lang (например, String ), которые подключаются в программу автоматически.
Например, знакомый по прошлым темам класс Scanner находится в пакете java.util , поэтому мы можем получить к нему доступ следующим способом:
То есть мы указываем полный путь к файлу в пакете при создании его объекта. Однако такое нагромождение имен пакетов не всегда удобно, и в качестве альтернативы мы можем импортировать пакеты и классы в проект с помощью директивы import , которая указывается после директивы package:
Директива import указывается в самом начале кода, после чего идет имя подключаемого класса (в данном случае класса Scanner).
В примере выше мы подключили только один класс, однако пакет java.util содержит еще множество классов. И чтобы не подключать по отдельности каждый класс, мы можем сразу подключить весь пакет:
Теперь мы можем использовать любой класс из пакета java.util.
Возможна ситуация, когда мы используем два класса с одним и тем же названием из двух разных пакетов, например, класс Date имеется и в пакете java.util , и в пакете java.sql . И если нам надо одновременно использовать два этих класса, то необходимо указывать полный путь к этим классам в пакете:
Статический импорт
В java есть также особая форма импорта — статический импорт. Для этого вместе с директивой import используется модификатор static :
Здесь происходит статический импорт классов System и Math. Эти классы имеют статические методы. Благодаря операции статического импорта мы можем использовать эти методы без названия класса. Например, писать не Math.sqrt(20) , а sqrt(20) , так как функция sqrt() , которая возвращает квадратный корень числа, является статической. (Позже мы рассмотрим статические члены класса).
То же самое в отношении класса System: в нем определен статический объект out , поэтому мы можем его использовать без указания класса.
Модуль 2. Урок 4. Пакеты в Java. — Введение в Java
Это базовая тема. Двигаться дальше, к следующему уроку, стоит только после вдумчивого понимания этой темы. Смелее задавайте вопросы в обсуждениях и не ленитесь читать уже заданные вопросы — возможно там уже есть для вас ответ или подсказка 🙂
Что такое пакеты?
Пакеты, по сути, являются файловой и логической структурой связей классов в мире java. Очень схоже с файловой системой компьютера. На уровне файловой системы пакеты это и есть папки, в которых лежат другие папки (подпакеты) и классы. Но пакеты не всегда описывают напрямую всю структуру проекта. На практике проект включает в себя различные ресурсы, а структура папок, которую мы назначаем как имена пакетов для наших классов — может быть лишь небольшой частью целого проекта. Ведь, кроме основного кода в пакетах, у нас должны быть еще и тесты, библиотеки или даже другие языки программирования в проекте в целом.
Пакеты необходимы не только для красивого размещения файликов по папочкам или решения серьезной проблемы коллизии имен, но и для разделения доступа классов друг к другу. Именно благодаря пакетам мы можем через точку . получать доступ к нужным нам классам различных библиотек.
Как аналогию, можно привести пример с адресами.
Представим себя в роли некого класса, который выполняет некие функции для этого мира. Для того чтобы этот мир к нам обратился — нам нужно иметь конкретный адрес, путь по которому можно будет взаимодействовать с нами. Пускай это будет адрес, например:
Что такое пакет для класса
Для класса его пакет — это его местоположение в проекте, относительно других классов. Благодаря разделению классов на несколько пакетов — мы организовываем структуру программы.
Сильно забегая вперед скажу, что такое разделение нужно не только для красоты, но и для ограничения доступа к некоторым членам класса. Например:
- отсутствие модификатора перед методом или полем (еще говорят package-private) — означает, что данный член класса будет виден другим классам, но только из этого же пакета;
- protected перед методом или полем — означает, что данный член класса будет виден не только классам текущего пакета, как с package-private, но и классам-наследникам.
Как создать класс внутри пакета?
По сути нам нужно:
- создать текстовый файл с расширением .java в нужной папке;
- в самом файле, помимо класса, написать имя его пакета.
Рассмотрим этот процесс поэтапно.
Сначала пишем имя любимого редактора в терминале, потом существующий путь, а потом имя будущего текстового файла. Пример для редактора nano :
Или с помощью sublime:
Если команда subl не найдена и Вы уверены в том, что sublime установлен — проверьте, в переменных среды окружения, наличие прописанного пути к папке, в которой лежит subl.
Можно и обычным блокнотом создать нужный файл в нужной директории. Создать сам файл можно и любым другим удобным для вас способом.
Файл создан. Но класса в нем нет. Создадим класс:
Теперь у нас есть и файл в нужной папке, и класс в файле. Но сам класс ничего не знает про то, что он принадлежит некому пакету. Исправим это:
Не забываем сохранять файл!
Ключевые моменты верного создания класса внутри пакета:
- внутри класса должно использоваться ключевое слово package ;
- ключевое слово package должно быть в первой строке кода, перед импортами и объявлением самого класса;
- после package нужно указать полное имя пакета, с корня пакета до пакета(папки) в которой размещен класс;
- каждая отдельная папка, в полном имени пакета, отделяется точкой;
- имя самого класса не входит в имя объявляемого пакета;
- реальное расположение файла и полное имя пакета, после слова package , — должны соответствовать друг другу.
Корень пакетов
А как же задать корневой каталог (папку) как основу пакетов, в котором уже и происходит ветвление этих всех под-пакетов (под-папок)? Почему, например, папка io является корнем для классов проекта, а папка src — не является пакетом, да и вообще не входит в пакетную структуру проекта?
Все очень просто: корневым пакетом считается тот который первым прописан в каждом java-файле после слова package , в текущем проекте. А в самом проекте помимо папки src, на ее уровне и выше, — могут быть много различных папок и файлов, для работы с проектом в целом. Но это не делает их корневым пакетом, или вообще частью пакетов java, в этом проекте, если они не включены в имена пакетов в классах, после ключевого слова package . Пример структуры папок и пакетов:
Пример содержимого класса OneMoreClass.java :
Пример содержимого класса SomeView.java :
Как видно из примеров выше — любой класс в этом проекте всегда содержит в имени пакета на первом месте папку io. Это и будет корневым пакетом проекта. На месте папки io могла быть папка com или любое другое имя. Важно чтобы все java-классы текущего проекта указывали на эту папку как на первую после ключевого слова package . Если хоть у одного класса в этом проекте папка io не будет прописана — то такой класс как бы и не в проекте, а просто мусор в папке.
Имена пакетов
- Имя состоит из одного слова (желательно).
- Без заглавных букв (желательно).
Например, package com.MySuperLongPackageName.view — плохая практика именования пакетов.
Совокупность имен под-пакетов делает проект уникальным, не похожим на миллионы других. Даже если, в каждом проекте в мире, 100% будет класс Main.java — то они маловероятно пересекутся и помешают друг-другу. Но даже если пересекутся — это решаемо, рассмотрим это в дальнейших примерах.
Применение пакетов
Адреса (пакеты) классам, в нашем проекте, мы уже выдали. Они нужны для доступа классов друг к другу.
Как уже было сказано выше — пакет можно сравнить с адресом. Рассмотрим это на примере ветвления папок(пакетов).
Допустим, в классе StartClass.java нам нужно создать экземпляр класса SomeView.java , для использования его метода message() . Как это можно реализовать:
Только благодаря прописанному пути к классу SomeView , класс StartClass может вообще узнать о его существовании.
Но прописывание таких длинных путей ( io.hexlet.xo.view.SomeView ) — просто не удобно. Поэтому, к нам на выручку, приходит импортирование.
Импортирование пакетов
Для того чтобы не писать длинные пути, к каждому конкретному классу, при каждом его использовании — нужно его импортировать. Для этого применяется ключевое слово import . Импорты пишутся между строчкой package . и строчкой объявления класса. Перепишем предыдущий пример StartClass с применением ключевого слова import :
Если в пакете io.hexlet.xo.view очень много разных классов. И они нам все нужны тут, в классе StartClass , как их все разом заимпортировать?
Решение приходит со звездочкой * .
Перепишем предыдущий пример с импортированием любых классов из пакета io.hexlet.xo.view :
В случае возникновения коллизий имен классов, например, когда в разных пакетах есть классы с одинаковыми именами и оба пакета импортированы — тогда придется обращаться к таким классам с использованием полных имени пакетов. Например, io.hexlet.xo.view.SomeView . Иначе java не будет знать из какого именно пакета использовать класс, в данном случае.
Импортирование по умолчанию
Независимо от того, написал ли программист вообще слово import , перед определением своего класса — java всегда автоматически, неявно, импортирует в текущий класс два пакета:
- java.lang.*; . Вручную в коде это можно прописать так: import java.lang.*; . Это одна из стандартных библиотек java.
- Текущий пакет, в котором находится текущий класс. Вручную это выглядело бы так: import . или import полный.путь.к.папке.с.этим.файлом .
Обратите внимание на строку System.out.println("Some very important message!"); в классе SomeView :
Класс SomeView видит класс System и его открытые поля, в частности поле out , благодаря стандартному импорту java.lang.*; , т.к. System входит в пакет java.lang .
Статическое импортирование
Этот аспект будет рассмотрен в "Модуль 3. Урок 3. Уровни методов в Java." Поскольку там мы лучше познакомимся с ключевым словом static .
Как компилировать классы в пакетах
Для компиляции, используется команда javac .
Для компиляции отдельного файла в конкретном пакете, нужно прописать команду так: javac src/com/package_name/package_name/ClassName.java . Обратите внимание, что для команды javac — мы прописываем все пути через слеш ( / ), а не через точки. И обязательно нужно указать расширение файлов ( .java ).
Если этот файл (класс) ClassName.java использует в своем коде другой класс, из соседнего пакета — это уже зависимость. Нужно подсказать компилятору, где еще лежат исходники (сорцы), от которых может зависеть компилируемый класс, с помощью ключа -sourcepath . Выглядит это так: javac -sourcepath src . А потом уже пишем путь к компилируемому файлу: src/com/package_name/package_name/ClassName.java . Целиком, в терминале, команда будет выглядеть так: javac -sourcepath src src/com/package_name/package_name/ClassName.java . -sourcepath src можно написать и в конце данной строки.
Для того чтобы класс-файлы не лежали рядом с исходниками, а в отдельной папочке, можно применить ключ -d , а за ним имя существующей папки, в которую складываются скомпилированные классы. Переделаем предыдущий пример так: javac src/com/package_name/package_name/ClassName.java -sourcepath src -d out .
Для того, чтобы компилятор прошелся по всем директориям в папке, например, src и скомпилировал там все исходники — нужно ввести команду так: javac src/**/*.java (пройтись по всем под папкам в папке src и скомпилировать там все файлы *.java ). Правда они опять будут лежать радом с исходниками. Лучше сразу разложить класс-файлы в отдельную папку: javac src/**/*.java -d out . Все скомпилированные классы будут разложены по пакетам так же как они располагались в папке src .
А если эти классы в папке src зависят друг от друга, то команда будет выглядеть так: javac src/**/*.java -d out -sourcepath src . В результате чего компилятор скомпилирует все *.java -файлы в *.class -файлы, свяжет их по зависимостям и уложит в директорию out .
Некоторые терминалы не понимают звездочки ** . Например, команда javac src/**/*.java может просто выдавать ошибку отсутствия файлов. "Понимание звездочек" нужно включать! В bash это можно включить командой: shopt -s globstar .
Как запускать классы в пакетах
Для запуска java-приложений используется команда java .
Для запуска отдельных классов, которые не в пакетах, используется простой подход, например: java Main , java Start , java MyStartClass . Главное чтобы в этом классе был специальный метод:
Именно с него начинается работа самостоятельной java-программы. В остальных классах одной программы — этот метод не нужен.
А для запуска "пакетного" класса на исполнение требуется иной подход.
Запустим наш класс StartClass .
Поскольку наш исполняемый файл StartClass.class лежит в отдельной папочке и в своей некой ветке директорий (пакете), то теперь нужно не просто написать java StartClass , а указать:
- classpath (путь к папке со всеми пакетами и скомпилированными классами в них);
- путь к стартовому классу в пакетной структуре этого класса.
-classpath , сокращенно: -cp . После этого ключа нужно указать имя папки, в которой лежат пакеты содержащие скомпилированные классы, в нашем случае это out .
Путь к стартовому классу, в пакетной структуре программы, нужно прописывать через точку: io.StartClass .
Команда запуска StartClass.class в одну строчку будет выглядеть так: java -cp ./out io.StartClass .
- В данной команде ключ пути к классам ( -cp ) должен идти первым, а потом уже путь и имя запускаемого класса.
- И имя класса должно быть без расширения .class (в отличие от javac )!
- Для запуска программы нужно указывать только тот класс, который содержит main -метод, остальные зависимости будут найдены и подключены из папки out автоматически, благодаря ключу -cp .
Полезные ссылки:
- Правильная инсталляция JDK и настройка переменных окружающей среды. Чтобы работала команда javac
- Не проходит команда со звездочками javac src/**/*.java ? Решение:
-
. .
Документация
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Об обучении на Хекслете
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно