410013796724260
• Webmoney
R335386147728
Z369087728698
Пакеты классов, packageПакет package позволяет логически объединить классы в наборы. Основные классы java входят в пакет java.lang. Различные вспомогательные классы располагаются в пакете в java.util. Классы для ввода и вывода входят в пакет java.io, а классы для работы в сети – в java.net. Некоторые их этих пакетов содержат подпакеты. Так, например, java.lang содержит два специализированных пакета java.lang.reflect и java.lang.ref, а java.util содержит подпакет java.util.zip, который включает классы для работы с ZIPархивами. Каждый класс имеет как простое имя, данное ему в определении, так и полное имя, включающее имя пакета, в который он входит. Например, класс String является частью пакета java.lang, а его полное имя – java.lang.String. Структура пакетов в точности отображает структуру файловой системы. Все файлы с исходными кодами (java-класс) и байт-кодами (расширением class), образующие один пакет, хранятся в одном каталоге файловой системы. Подпакеты образуют подкаталоги этого каталога. Каждый пакет создает единое пространство имен namespace. Это означает, что все имена классов и интерфейсов в пакете должны быть уникальны. Имена в разных пакетах могут совпадать, но это будут разные программные модули. Организация классов в виде пакетов позволяет избежать конфликта имен между классами. В пакете дублирование имен классов не допускается. Принадлежность класса к пакету позволяет гарантировать однозначность имен. Чтобы указать, что класс принадлежит определенному пакету, следует использовать директиву package, после которой указывается наименование (путь) пакета : package company.common; public class HelloWorld{ public static void main(String[] args){ System.out.println ("Привет, мир!"); } } В данном примере класс HelloWorld располагается в пакете company.common. Физически это директория «${project.src}/company/common». При создании класса в среде разработки IDE (например, Eclipse) следует указать наименование пакета, тогда IDE самостоятельно при необходимости создаст каталог на жестком диске и разместит новый класс в этом каталоге. Можно package в классе не определять. В этом случае класс будет находиться в пакете по умолчанию, который не имеет имени «${project.src}», т.е. класс будет располагаться в корневой директории исходных кодов проекта. Наименование пакета может быть любым, но необходимо соблюдать его уникальность в проекте. Соглашение «Code Conventions» рекомендует записывать имена пакетов строчными буквами. Тогда они не будут совпадать с именами классов, которые, по соглашению, начинаются с прописной буквы. Стандартная библиотека Java API включает сотни классов. Каждый программист в ходе работы создает десятки своих классов. Множество классов быстро увеличивается. Java позволяет отдельные классы, решающие определенную задачу (или несколько задач), объединять в библиотеки классов в виде архивов jar. Но эти библиотеки классов, кроме стандартных, не являются частью языка java. Импорт пакетов и классов, importДля использования класса в приложении, его следует подключить. Так расположенный в пакете java.util класс Scanner можно подключить следующим способом : java.util.Scanner in = new java.util.Scanner(System.in); В этом примере при определении/создании нового объекта был указыван пакет (полный путь к файлу). Однако данный подход не всегда удобен, и в качестве альтернативы можно импортировать пакеты и классы в приложение с помощью директивы import, которая указывается после директивы package : package company.common; import java.util.Scanner; public class HelloWorld{ public static void main(String[] args){ Scanner in = new Scanner(System.in); } } Директива import указывается в самом начале кода, после чего идет имя подключаемого класса (класс Scanner в примере). В примере был подключен только один класс. Однако пакет java.util содержит большое количество разных классов. И чтобы не подключать по отдельности каждый класс, можно сразу подключить весь пакет : import java.util.*; // импорт всех классов из пакета java.util Теперь можно использовать любой класс из пакета java.util. Возможна ситуация, когда используется два класса с одинаковым наименованием, но из разных пакетов. Это относится, например, к классам Date, которые имеются в пакете java.util и в пакете java.sql, или классам List пакетов java.util и java.awt. И если необходимо одновременно использовать оба эти класса, то необходимо указывать полный путь к классам в пакете : java.util.Date udate = new java.util.Date(); java.sql.Date sdate = new java.sql.Date(); Следует сказать, что основные классы из пакета java.lang (например, String) подключаются автоматически и не требуют «импортирования». Статический импорт классов, import staticВ java можно использовать статический импорт. Для этого вместе с директивой import используется модификатор static : package company.common; import static java.lang.Math.*; import static java.lang.System.*; public class HelloWorld { public static void main(String[] args) { double result = sqrt(20); out.println(result); } } В примере определяется статический импорт классов System и Math, которые имеют статические методы. Определение статического импорта позволяет использовать статические методы без названия класса. В примере статическая функция sqrt(20) (можно и Math.sqrt(20)), возвращает квадратный корень числа. То же самое относится и к классу System, в котором определен статический объект out, поэтому можно его использовать без указания класса, если выполнен статический импорт класса System. Пример использования классов разных пакетовРассмотрим простенький проект PackageExample, включающий 3 java-класса. Два java-класса располагаются в одном пакете «ru.java.online», а третий - в другом «ru.java.online.classes». Структура проекта представлена на следующем скриншоте: Листинг базового класса, BaseClass.javaБазовый класс включает 2 поля (id, name) и методы get/set. В конструкторе значения полей инициализируется. package ru.java.online; public class BaseClass { private String id = null; protected String name = null; public BaseClass() { this.id = "default"; this.name = "Наименование не определено"; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.getClass().getName() + "\n\t{id = '" + id + "', name = '" + name + "'}"; } } Переопределенная функция toString() возвращает наименование класса и значение полей. Листинг наследника, Inheritor.javaКласс Inheritor.java наследует свойства базового класса BaseClass.java. Поскольку классы располаются в разных пакетах, то базовый класс необходимо импортировать. package ru.java.online.classes; import ru.java.online.BaseClass; public class Inheritor extends BaseClass { public Inheritor() { this.name = "Наследник"; this.setId("Первый"); } } Листинг основного класса, MainPackage.javaОсновной класс включает статический метод main. Поскольку данный класс не «видит» наследника, то его приходится импортировать. package ru.java.online; import ru.java.online.classes.Inheritor; public class MainPackage { public MainPackage() { BaseClass bc = new BaseClass(); Inheritor ir = new Inheritor(); System.out.println (bc.toString()); System.out.println (ir.toString()); } public static void main(String[] args) { new MainPackage(); System.exit(0); } } Результат выполнения данной программы выводится в консоль в следующем виде : ru.java.online.BaseClass: {id = 'default', name = 'Наименование не определено'} ru.java.online.classes.Inheritor: {id = 'Первый', name = 'Наследник'} Как видно по результату выполнения программы наименование класса включает пакет. Говоря о полном наименовании класса следует отметить, что оно включает не только наименование пакета и наименование класса, но также и класс-загрузчик classloader. Подробно о классах-загрузчиках можно почитать здесь. |