
- •JAVA-ТЕХНОЛОГИЯ
- •Пакеты (packages)
- •Единица компиляции (compilation unit) в Java
- •Пример определения пакета
- •Использование классов пакета algebra
- •Иерархия пакетов
- •Соглашение об именовании пакетов
- •Поиск используемых классов и пакетов при компиляции
- •Новые возможности (Java 1.5)
- •Уточнение: поля и методы protected доступны не только в потомках, но и из
- •Структура директорий и структура пакетов
- •Другой вариант (для больших проектов)
- •Компиляция (home включена в CLASSPATH)
- •Некоторые стандартные пакеты Java API
- •Статические инициализаторы в классах
- •Вложенные классы и интерфейсы
- •Пример класса Element , вложенного в класс List
- •Использование классов List и Element
- •Пример внутреннего класса (D. Flanagan, Java in a NutShell)
- •Использование внутреннего класса
- •Локальный анонимный класс

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 3

Пакеты (packages)
Пакет (package) – совокупность определений типов (types) –
интерфейсов (interface) и классов (class), образующая отдельную область локализации входящих в них имен классов и интерфейсов.
В пакет не могут входить никакие другие определения (констант, полей и др.), в силу объектной ориентированности Java.
Отличия пакетов Java от namespaces (C++, C#) :
пакеты образуют иерархию; содержат лишь классы и интерфейсы
Пакеты – основная конструкция для структурирования
программ на Java
Программа на Java – иерархия пакетов и подпакетов
(subpackages)
(C) В.ОПолное. Сафонов.имя пакета указывается в его объявлении (в 2013 начале файла исходного Java-текста)

Единица компиляции (compilation unit) в Java
package p1.p2. … pn; // полное имя пакета
import q1.q2. … qm.C; // C – имя класса или интерфейса (не пакета)
…
import r1.r2. … rk.*; // импортируются все public классы и
// public интерфейсы из пакета r1.r2 … rk
…
[ public ] class C1 … // определения типов - классов
[ public ] interface I1 … // и интерфейсов (в любом порядке)
//Рекомендуется каждый класс (интерфейс) С определять в отдельном
//файле исходного кода: С.java
(C)В.О. Сафонов.
2013

Пример определения пакета
package algebra; // объявление пакета
import java.io.*; // импортирование стандартного пакета public class Vector { …
public Vector add(Vector v) { … } public Vector sub(Vector v) { … } public double scal(Vector v) { … }
} // исходный код– в файле Vector.java
public class Matrix из того же пакета algebra рекомендуется определять в отдельном файле Matrix.java с тем же объявлением пакета:
package algebra; …
public class Matrix { … } // исходный код– Matrix.java
(C) В.О. Сафонов. 2013

Использование классов пакета algebra
package tutorial;
import algebra.Vector; // (1) import algebra.Matrix; // (2)
//альтернатива:
//import algebra.*; // (1) и (2) рекомендуется для наглядности public class Student {
public static void main(String[] args)
{Vector a = new Vector(…); Vector b = new Vector(…);
Vector c = a.add(b); double s = a.scal(b);
// без объявления import: algebra.Vector algebra.Vector.add
}
}
(C) В.О. Сафонов. 2013

Иерархия пакетов
Определение иерархии пакетов и ограничения
package p; … public class C … // public class q – ошибка!
package p.q; … public class D … Пакет p.q – подпакет пакета p =>
пакет p не может содержать класса или интерфейса q.
Более точно: в JDK 1.2 компилятор javac этого не проверяет,
а в JDK 1.3+ – проверяет.
|
|
Полные имена классов: p.C |
p.q.D |
|
Эффективность доступа к классам в любой |
||
(C) |
|
иерархии пакетов одинакова. Цель иерархии |
|
|
В.О. Сафонов. |
|
|
2013 |
пакетов – структуризация программ и разрешение |

Соглашение об именовании пакетов
HardSoft.COM, LightSoft.COM – имена компаний в WWW (domain names)
Предположим, что обе компании разработали пакеты с одинаковым именем coolMath, предназначенные для широкого распространения
Способ именования этих пакетов
(соглашение, рекомендуемое авторами Java) :
COM.HardSoft. coolMath – пакет, разработанный в HardSoft
COM.LightSoft.coolMath – пакет, разработанный в
LightSoft
(C) В.О. Сафонов. 2013

Поиск используемых классов и пакетов при компиляции
Компилятор javac использует переменную окружения CLASSPATH – список корневых директорий, в которых он ищет пакеты и классы, используемые в текущей единице компиляции (в путях указываются директории либо .jar – архивы)
UNIX (Solaris, Linux) - .profile, .cshrc :
setenv CLASSPATH ~/my/classes:~/their/classes:/my/archive/arch.jar:.
Windows (XP, 2003, Vista, 2008, 7) – autoexec.bat:
set CLASSPATH=d:\my\classes;d:\their\classes;d:\my\archive\arch.jar;.
Включение текущей директории “ .” в CLASSPATH настоятельно рекомендуется.
Ссылку на системные классы (входящие в JDK) требовалось включать
вCLASSPATH только в JDK 1.1.x, например: /usr/local/java/jdk1.1.8/solaris/lib/classes.zip
ВJDK 1.2, JDK 1.3, JDK 1.4, JDK 1.5, JDK 1.6 компилятор и JVM находят их сами
CLASSPATH можно явно указать как опцию javac и java (-classpath):
java -classpath ~/my/classes:. MyClass
При этом ее значение полностью перекрывает значение переменной окружения CLASSPATH.
Можно писать кратко: –cp
(C) В.О. Сафонов. 2013

Новые возможности (Java 1.5)
Class path wildcards
Вместо:
javac –cp .:./my/libs/lib1.jar:./my/libs/lib2.jar MyCode.java
можно писать:
javac –cp ’./my/libs/*’ MyCode.java
Static import: импортирование статических элементов класса (типа) без импортирования самого типа.
Полезно для использования констант
import static java.lang.Math.PI; // или: … java.lang.Math.*; double r = cos (PI * theta);
(C) В.О. Сафонов. 2013

Уточнение: поля и методы protected доступны не только в потомках, но и из других классов текущего пакета
Пример:
package pp; public class C {
protected int a; public C(int aa) {
a = aa;
}
} // C
package pp; public class D {
public static void main(String[] args)
{
C p = new C(1); System.out.println("a = " + p.a);
}
}// Вывод: a = 1
(C) В.О. Сафонов. 2013