Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java1_2013_2014 / java3.pptx
Скачиваний:
131
Добавлен:
16.04.2015
Размер:
137.02 Кб
Скачать

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

Соседние файлы в папке java1_2013_2014