Оригинал этой статьи находится на WWW сервере фирмы Jet Infosystems

Александр Таранов,
Владимир Цишевский


    Содержание



1. Введение

2. Интернет, WWW и Интранет

3. Java, Joe, NEO

4. Java - язык и технология
4.1. Язык Java
4.1.1. Объектная модель языка Java
4.1.2. Примитивные типы данных
4.1.3. Пакеты
4.1.4. Управляющие конструкции
4.1.5. Исключительные ситуации
4.1.6. Механизм потоков
4.2. Технология Java
4.2.1. Технологический цикл обработки Java-программ
4.2.2. Java-машина
4.2.3. Java и безопасность
4.2.4. Java WorkShop
4.3. Связь Java с окружением: оконный инструментарий
4.3.1. Общие положения
4.3.2. Из чего строится графический интерфейс (компоненты и контейнеры)
4.3.3. Как организовать интерфейс
4.3.4. События
4.3.5. Методы класса Component, связанные с обработкой событий

5. Joe - технология связывания Java-программ с объектными биз-
нес-приложениями

6. Заключение


    1. Введение



Когда говорят и пишут о Java, самой популярной фразой является
"мир сошел с ума". Действительно, и скорость, и характер расп-
ространения (так и хочется вспомнить лексикон недавнего прошло-
го и сказать о "победном шествии") не имеют аналогов. При появ-
лении альфа-версии продукта выстраивается очередь на его лицен-
зирование (рис. 1).

Рис. 1. Они хотят лицензировать технологию Java (снимок сделан
на острове Ява).

Бета-версия становится инструментом реализации информационных
систем крупных компаний. Акции компаний, имеющих прочные пози-
ции в Интернет, растут, как на дрожжах. Все бросились реализо-
вывать WWW-навигаторы с поддержкой Java и борются за право пе-
редать их в бесплатное использование как можно большему числу
клиентов. Идет сражение за долю будущего рынка, контуры которо-
го пока только намечаются, сражение с применением средств, ко-
торые с точки зрения "здравого бизнеса" иначе как дикими и наз-
вать нельзя.

В чем причина всеобщего помешательства и что это за продукт,
околдовавший мир? Попытаемся совсем коротко высказать некоторые
соображения по первому вопросу, после чего перейдем на чисто
технические рельсы и сосредоточимся на описании технологии и
языка Java и ассоциированных продуктов.

Персональные компьютеры сделали информационные технологии
частью массовой культуры. При миллионных тиражах даже единст-
венный "компьютерный хит" способен принести очень большие день-
ги. Авторы многих подобных хитов, помимо богатства, получают
колоссальное влияние на людей, что по существу является источ-
ником огромного дополнительного обогащения. И тем не менее, уже
довольно длительная история развития персональных компьютеров
не знала ничего, подобного феномену Java. Что изменилось в мире
в последние годы, почему этот феномен стал возможен?

Изменился Интернет. Он стал доступен миллионам людей, далеких
от технических проблем. Число пользователей Интернет по порядку
величины уже не отличается от числа пользователей персональных
компьютеров и продолжает взрывообразно расти. Одновременно Ин-
тернет обеспечил такую скорость распространения новинок инфор-
мационных технологий, которую не могли и никогда не смогут дать
традиционные каналы сбыта. Время спрессовалось. В Интернете,
опоздав буквально на день, компьютерная компания, даже крупная,
рискует серьезно ослабить свои позиции сразу во всем мире.

    2. Интернет, WWW и Интранет



Информационные перегрузки - характерная черта нашего времени.
Созданы мощные механизмы, обеспечивающие производство огромного
количества информации. Существенно меньше сделано для облегче-
ния ее получения и использования.

Типичной является ситуация, когда инициатива принадлежит пос-
тавщику, а не потребителю информации. Поставщик по определенно-
му поводу создает информацию и направляет ее всем, кто, по его
мнению, в ней нуждается (рис. 2).

Рис. 2. Доставка информации по инициативе поставщика

Так работают средства массовой информации, издательства, рек-
ламные агентства. Так работает электронная почта. В большинстве
случаев потребителю эта информация, может быть, и нужна, но не
в данный момент, не сейчас. Потребитель вынужден архивировать
полученную информацию. При этом в лучшем случае велика вероят-
ность, что к моменту, когда информация действительно понадобит-
ся, она потеряет актуальность. Обычно же у потребителя просто
накапливаются горы мусора, в котором отыскать нечто нужное поч-
ти невозможно.

Чтобы информация была актуальной для потребителя, она должна
доставляться к нему по запросу - в точности тогда, когда в ней
возникла необходимость. Кроме того, поставщик должен сохранять
возможность управления информацией, он должен не только созда-
вать ее, но и вовремя обновлять и уничтожать.

Централизованные компьютерные системы, доминировавшие еще 10
лет назад, позволяли пользователям сравнительно легко находить
информацию в оперативном режиме, однако они затрудняли управле-
ние информацией, поскольку ее источники, как правило, разнород-
ны и территориально разнесены. Еще один важный недостаток цент-
рализованных систем - их сложность и дороговизна (рис. 3).

Рис. 3. Взаимодействие с централизованной компьютерной системой

Подавляющему большинству российских организаций они просто не
по карману.

Сети персональных компьютеров существенно дешевле централизо-
ванных систем, они оставляют за поставщиком необходимую свободу
управления информацией, однако потребителям приходится искать
необходимые данные на множестве машин, среди большого числа
приложений (рис. 4).

Рис. 4. Получение информации из сети персональных компьютеров

Рядовому пользователю работать в такой разнородной прикладной
среде крайне неудобно.

Способ разрешения указанных проблем, к которому прибегают веду-
щие компании, состоит в построении информационной структуры ор-
ганизации по образу и подобию Интернет, с Web-сервисом в ка-
честве концептуальной основы (рис. 5).

Рис. 5. Универсальный клиент Web-сервиса

Возможность хранения данных различных типов (текст, графика,
аудио, видео) в сочетании с механизмами связывания информации,
расположенной в разных узлах компьютерной сети, позволяют расс-
редотачивать информацию в соответствии с естественным порядком
ее создания и потребления, осуществлять единообразный доступ,
отправляясь от небольшого числа известных "корней". Тем самым
поставщик может эффективно готовить и контролировать информа-
цию, а потребитель в состоянии без труда найти необходимые дан-
ные именно тогда, когда они стали нужны.

Средства Web, помимо связывания распределенных данных, осу-
ществляют еще одну очень важную функцию. Они позволяют рассмат-
ривать информацию с нужной степенью детализации, что существен-
но упрощает анализ больших объемов данных. Можно быстро отоб-
рать самое интересное, а затем изучить выбранный материал во
всех подробностях.

Таким образом, Web-серверы и Web-навигаторы могут и должны ис-
пользоваться не только в "мировом масштабе". Web - это инфраст-
руктурный сервис, необходимый каждой организации со сколько-ни-
будь заметными информационными потоками.

В то же время, Web-сервису присущи и определенные недостатки,
вытекающие из отсутствия состояний в HTTP-протоколе. Во-первых,
клиент по существу лишен средств управления внешним представле-
нием объектов на просматриваемой WWW-странице (единственное,
что он может сделать, это сменить WWW-навигатор).

Во-вторых, Web-страницы статичны. При использовании протокола
HTTP, на клиентскую систему передаются только пассивные данные,
но не методы объектов. Из общих соображений очевидна ограничен-
ность подобного подхода. Данный недостаток, разумеется, связан
с первым. Объект сам должен знать, как себя показывать - точнее
говоря, он должен это выяснить, проанализировав клиентское ок-
ружение.

В-третьих, Web-сервис обладает весьма ограниченными интерактив-
ными возможностями, которые сводятся к заполнению пользователем
чисто текстовых форм с последующей отправкой на сервер. Такая
форма общения вполне устраивала пользователей терминалов ЕС ЭВМ
лет 15 назад. Сейчас ее явно недостаточно.

Java-технология позволяет устранить все отмеченные недостатки.
Как именно - будет ясно из последующего изложения. В результате
Web-сервис, и без того имевший огромную популярность, получил
как бы новый импульс. Этот экспресс понесся вперед с удвоенной
скоростью, увлекая за собой и Java.

    3. Java, Joe, NEO



В узком смысле слова Java - это объектно-ориентированный язык,
напоминающий C++, но более простой для освоения и использова-
ния. В более широком смысле Java - это целая технология прог-
раммирования, изначально рассчитанная на интеграцию с Web-сер-
висом, то есть на использование в сетевой среде, Поскольку Web-
навигаторы существуют практически для всех аппаратно-программ-
ных платформ, Java-среда должна быть как можно более мобильной,
в идеале полностью независимой от платформы.

С целью решения перечисленных проблем были приняты, помимо ин-
теграции с Web-навигатором, два других важнейших постулата.

- Была специфицирована виртуальная Java-машина, на которой
должны выполняться (интерпретироваться) Java-программы. Опреде-
лены архитектура, представление элементов данных и система ко-
манд Java-машины. Исходные Java-тексты транслируются в коды
этой машины. Тем самым, при появлении новой аппаратно-программ-
ной платформы в портировании будет нуждаться только Java-маши-
на; все программы, написанные на Java, пойдут без изменений.

- Определено, что при редактировании внешних связей Java-прог-
раммы и при работе Web-навигатора прозрачным для пользователя
образом может осуществляться поиск необходимых объектов не
только на локальной машине, но и на других компьютерах, доступ-
ных по сети (в частности, на WWW-сервере). Найденные объекты
загружаются, а их методы выполняются затем на машине пользова-
теля.

Несомненно, между двумя сформулированными положениями существу-
ет тесная связь. В компилируемой среде трудно дистанцироваться
от аппаратных особенностей компьютера, как трудно (хотя и мож-
но) реализовать прозрачную динамическую загрузку по сети. С
другой стороны, прием объектов извне требует повышенной осто-
рожности при работе с ними, а, значит, и со всеми Java-програм-
мами. Принимать необходимые меры безопасности проще всего в ин-
терпретируемой, а не компилируемой среде. Вообще, мобильность,
динамизм и безопасность - спутники интерпретатора, а не компи-
лятора.

Принятые решения сделали Java-среду идеальным средством разра-
ботки клиентских компонентов Web-систем. Особо отметим прозрач-
ную для пользователя динамическую загрузку объектов по сети. Из
этого вытекает такое важнейшее достоинство, как нулевая стои-
мость администрирования клиентских систем, написанных на Java.
Достаточно обновить версию объекта на сервере, после чего кли-
ент автоматически получит именно ее, а не старый вариант. Без
этого реальная работа с развитой сетевой инфраструктурой прак-
тически невозможна. С другой стороны, при наличии динамической
загрузки действительно возможно появление устройств класса
Java-терминалов, изначально содержащих только WWW-навигатор, а
все остальное (и программы, и данные) получающих по сети.

Здесь уместно отметить замечательную точность в выборе основных
посылок проекта Java. Из минимума предположений вытекает макси-
мум новых возможностей при сохранении практичности реализации.

В то же время, интеграция с WWW-навигатором и интерпретируемая
природа Java-среды ставят вполне определенные рамки для реаль-
ного использования Java-программ (хотя, конечно же, язык Java
не менее универсален, чем, скажем, C++). Например, известно,
что интерпретация, по сравнению с прямым выполнением, примерно
на полтора порядка медленнее. Трудно сказать, насколько могут
улучшить положение компиляция "на лету" и использование специа-
лизированных Java-процессоров, но пока использование Java на
серверной стороне представляется проблематичным.

Далее, хотя технология Интранет, основанная на использовании
Web-сервиса в качестве информационной основы организации, явля-
ется огромным шагом вперед, существуют и другие сервисы, как
унаследованные, так и современные (например, реляционные СУБД),
которые обязательно должны входить в состав корпоративной сис-
темы. Если вся связь между клиентами и упомянутыми серверами
будет осуществляться через сервер WWW, последний станет узким
местом, а решения Интранет рискуют лишиться такого важнейшего
достоинства, как масштабируемость. Значит, необходима прямая
связь между клиентскими системами, написанными на языке Java, и
произвольными сервисами (рис. 6).

Рис. 6. Прямая связь между Java-клиентами и корпоративными сер-
верами.

Как реализовать такую связь?

В общем виде ответ очевиден - нужны средства для полноценной
интеграции Java в распределенную объектную среду. На серверной
стороне компания Sun Microsystems имеет соответствующую техно-
логию - NEO (NEtworked Objects, сетевые объекты). Технология
NEO удовлетворяет спецификациям CORBA (Common Object Request
Broker Architecture), являющимся промышленным стандартом. При
реализации корпоративных информационных систем с использованием
NEO наиболее естественным представляется использование треху-
ровневой архитектуры с серверами приложений, построенными на
объектных принципах, на втором уровне и с базовыми и унаследо-
ванными серверами на третьем уровне (рис. 7).

Рис. 7. Трехуровневая архитектура корпоративной информационной
системы.

К сожелению, столь общий ответ никак не помогает осуществлять
прямую связь между Java-клиентом и NEO-сервером. Конечно, можно
воспользоваться стандартными средствами программирования в се-
тевой среде (а Java допускает использование библиотек, написан-
ных на C/C++, равно как и вставку машинных кодов), но если это
было бы единственной возможностью, Java рисковала остаться на
уровне "оживлялок" для MS-Windows. В конце марта 1996 года ком-
пания SunSoft объявила о появлении нового продукта с именем
Joe, как раз и предназначенного для существенного облегчения
встраивания Java-клиентов в информационные системы Интранет,
построенные в трехуровневой архитектуре с использованием среды
NEO (рис. 8).

Рис. 8. Распределение ролей между Java, Joe и NEO.

Таким образом, сложилась полная и изумительно красивая картина
организации современных Интранет-систем. В данной статье мы
уделим основное внимание технологии Java. Далее будет кратко
рассмотрены возможности, предоставляемые системой Joe.


    4. Java - язык и технология



    * 4.1. Язык Java



При описании языка Java будет предполагаться, что читатель, хо-
тя бы в общих чертах, знаком с языком C++.

    4.1.1. Объектная модель языка Java



Когда говорят об объектно-ориентированном языке программирова-
ния, предполагают поддержку трех механизмов:

- инкапсуляция

- наследование

- полиморфизм.

Инкапсуляция и наследование в языке Java реализуются с помощью
понятия класса.

    4.1.1.1. Классы



Понятие класса в языках Java и C++ очень близки. Класс является
шаблоном для создания объектов; он может содержать данные и ме-
тоды. Приведем пример класса, описывающего точки в двумерном
пространстве (здесь и далее номера строк используются для пос-
ледующих пояснений и не являются частью Java-программ).

1 class Point extends Object {
2 private double x;
3 private double y;

4 Point (double x, double y) {
5 this.x = x;
6 this.y = y;
7 }

8 Point () {
9 this (0.0, 0.0);
10 }

11 public void setX (double x) {
12 this.x = x;
13 }

14 public void setY (double y) {
15 this.y = y;
16 }
. . .
17 }

В языке Java нельзя отрывать определение метода (функции) от
описания заголовка. Синтаксическая конструкция class полностью
включает в себя всю информацию о классе. В частности, реализа-
ции методов обязаны содержаться внутри этой конструкции.

Для обозначения наследования используется ключевое слово
extends (строка 1). Класс Object - это корень дерева наследова-
ния. В Java не бывает классов-"сирот": у всех классов, кроме
Object, есть предшественник. Подробнее наследование и предопре-
деленные классы будут рассмотрены далее.

Режимы доступа к элементам класса (private, protected, public)
те же, что и в C++, за одним важным исключением. Если режим
доступа опущен, предполагается, что соответствующий элемент
доступен в пределах пакета (см. далее).

В строке 9 приведен пример явного вызова одного конструктора из
другого.

Прочие приведенные выше строки не нуждаются в пояснениях кроме
одной - отсутствующей. В языке Java не бывает деструкторов.
Причина в том, что управление памятью автоматизировано (в фоно-
вом режиме работает сборщик мусора). Для высвобождения прочих
ресурсов, ассоциированных с объектом, служит специальный метод
finalize. Этот метод вызывается сборщиком мусора в момент ути-
лизации памяти, занимавшейся объектом.

Ключевое слово this (см., например, строки 5 и 9) используется
для ссылки на самого себя. Аналогичную роль по отношению к ро-
дительскому классу играет слово super:

1 class ThreePoint extends Point {
2 protected double z;

3 ThreePoint () {
4 super ();
5 z = 0.0;
6 }

7 ThreePoint (double x, double y, double z) {
8 super (x, y);
9 this.z = z;
10 }
11 }

В строках 4 и 8 вызываются конструкторы родительского класса.

Приведенные примеры показывают, что в языке Java, как и C++,
методы могут быть перегруженными, то есть под одним именем мо-
гут фигурировать разные методы с разным набором параметров.

Как и C++, с помщью ключевого слова static можно определить
данные и методы, которые являются общими для всех объектов
класса. (Отметим попутно, что функций, не принадлежащих какому-
либо классу, в языке Java не бывает.) Следующий пример содержит
фрагменты стандартного пакета java.lang.

1 public final
2 class Character extends Object {

3 public static final int MAX_RADIX = 36;

4 static char downCase[];

5 static {
6 char down[] = new char[256];
7 for (int i = 0 ; i < 256 ; i++) {
8 down[i] = (char) i;
9 }
10 for (int lower = 'a' ; lower <= 'z' ; lower++) {
11 int upper = (lower + ('A' - 'a'));
12 down[upper] = (char)lower;
13 }

14 for (int lower = 0xE0; lower <= 0xFE; lower++) {
15 if (lower != 0xF7) { // multiply and divide
16 int upper = (lower + ('A' - 'a'));
17 down[upper] = (char)lower;
18 }
19 }
20 downCase = down;
21 }

22 public static boolean isLowerCase(char ch) {
23 return (upCase[ch] != ch);
24 }

25 }

Прокомментируем этот пример с точки зрения отличий Java от C++.

Строки с 5 по 21 представляют собой инициализацию статических
данных класса, которая осуществляется в момент загрузки класса
в Java-машину. По сути этот код играет роль конструктора класса
Character.

В строках 1 и 3 встречается ключевое слово final. В строке 1
это слово обозначает запрет на наследование от класса
Character. В строке 3 его смысл аналогичен описателю const в
C++.

Если слово final использовано в заголовке метода, то данный ме-
тод не может быть переопределен в классах-наследниках.

Как и в C++, в языке Java классы могут быть абстрактными, то
есть не до конца конкретизированными. Это означает, что в клас-
се описаны методы, определения которых отсутствуют. Такие мето-
ды (как и сам класс) должны снабжаться описателем abstract.
Абстрактные методы должны конкретизироваться в производных
классах.

В языке Java имеется предопределенная иерархия классов, содер-
жащихся в пакете java.lang. На рис. 9 эта иерархия представлена
графически.

Рис. 9. Иерархия предопределенных классов языка Java.

В этой иерархии несколько особняком стоит класс Class. Програм-
мист не может создать объект класса Class (правда, существуют и
другие классы с этим свойством). Ссылки на объкт класса Class
можно получить с помощью метода getClass, определенного для об-
ъектов класса Object.

Объекты класса Class используются для получения во время выпол-
нение информации о "классовых" свойствах объекта. К объектам
класса Class, помимо прочих, применимы следующие методы:

1 public native String getName();
2 public native Class getSuperclass();
3 public static native Class forName(String className)
throws ClassNotFoundException;

Метод forName позволяет получить ссылку на класс по его имени.
Описатель native свидетельствует о том, что метод реализуется
средствами, внешними по отношению к Java-системе (например, пи-
шется на языке C).

    4.1.1.2. Наследование



Модель наследования в языке Java существенно отличается от мо-
дели C++. Во-первых, в Java нет множественного наследования.
Во-вторых, в языке предусмотрены средства для запрета дальней-
шего наследования (ключевое слово final перед определением
класса). В-третьих, в языке Java присутствует новое по отноше-
нию к C++ понятие интерфейса.

Интерфейс представляет собой набор описаний методов. Пример:

public interface Verbose {
public void drawOn (Graphics g);
public void printOn (OutputStream os);
}

public class Star extends Polygon implements Verbose {
public void drawOn (Graphics g) {
// Конкретная реализация отрисовки
}
public void printOn (OutputStream os) {
// Конкретная реализация печати
}
}

public class Text extends StringBuffer implements Verbose {
public void drawOn (Graphics g) {
// Конкретная реализация отрисовки
}
public void printOn (OutputStream os) {
// Конкретная реализация печати
}
}

public class Blackboard extends Canvas {
public void drawVerbose (Verbose d) {
Graphics g = getGraphics ();
d.drawOn (g);
}
}

Интерфейс Verbose содержит два метода. Первый предназначен для
рисования в графическом контексте, второй - для распечатки в
выходной поток.

Класс Star предствляет собой подкласс многоугольников
(Polygon). Помимо прочего, мы хотим рисовать объекты этого
класса на доске (Blackboard) и выводить их описание в файл.

Для объектов класса Text мы хотим иметь возможность начертать
текст на доске и выводить его в файл.

Класс Blackboard - наследник класса Canvas, специально предназ-
наченного для рисования. Как мы видим, этот класс с помощью
единственного метода справляется с рисованием объектов, не име-
ющих общего предка (кроме класса Object).

Таким образом, с помощью интерфейсов можно компенсировать от-
сутствие множественного наследования. В контексте наследования
интерфейс можно рассматривать как абстрактный класс, не содер-
жащий данных.

    4.1.1.3. Жизненный цикл объекта



Объекты создаются с помощью оператора new. Инициализация объек-
та производится с помощью соответствующего конструктора. Эти
операции разделить нельзя - за new следует конструктор. Пример.

Point myPoint = new Point ();

Других способов создания объектов (кроме оператора new) язык
Java не предоставляет.

Объект существует до тех пор, пока на него есть ссылки (то есть
пока он прямо или косвенно доступен хотя бы из одной перемен-
ной). В языке отсутствуют явные средства удаления объектов.
После того, как объект стал недоступен, он оказывается кандида-
том для утилизации сборщиком мусора.

Объект может стать недоступным, если хранившей его переменной
присвоено новое значение или если эта переменная перестала быть
доступной (произошел выход из блока). Пример.

Point p = new Point (100.0, 100.0);
. . .
p = new Point (1.0, 1.0);
// На точку с координатами (100, 100) ссылок больше нет

{
String s = new String ("Local string");
System.out.println (s);
}
// На строку "Local string" ссылок больше нет

В момент утилизации объекта сборщиком мусора будет вызван метод
finalize. Из-за того, что сборщик мусора работает в фоновом ре-
жиме, вызов finalize является асинхронным.

    4.1.2. Примитивные типы данных



В языке Java существует набор встроенных типов данных, которые
не являются объектами. Их не так много.

Представление чисел в языке Java фиксировано и, тем самым, не
зависит от аппаратной платформы.

- целые числа:
- - byte - 8 бит,
- - short - 16 бит,
- - int - 32 бита,
- - long - 64 бита.
Все числа со знаком, спецификатор unsigned в языке отсутствует.

- числа с плавающей точкой:
- - float - 32 бита,
- - double - 64 бита.
Представление должно соответствовать стандарту IEEE 754.

- char
Значение типа char есть 16-разрядное число без знака (диапазон
0-65535). Кодировка соответствует стандарту Unicode. В резуль-
тате с самого начала закладывается здоровая основа для решения
проблемы локализации Java-программ.

- boolean
Содержит значения true и false, которые не могут быть преобра-
зованы в другой тип.

В языке Java, разумеется, присутствуют массивы. Эти массивы ти-
пизированы. Декларация

Point myPoints[];

описывает переменную myPoints как массив объектов типа Point.
Завести массив определенного размера можно с помощью инструкции
вида

myPoints = new Point[10];

Значения элементов массива при этом устанавливаются равными
специальной величине null.

Размер массива может быть получен во время выполнения програм-
мы:

howMany = myPoints.length;

Других структурных типов (не являющихся объектами) в языке Java
нет, то есть нет структур, объединений и т.п. Нет в Java и ука-
зателей.

Отметим, что строки символов являются объектами типа String
(текстовые константы) или StringBuffer (изменяемые строки).
Пример,

String hello = "Hello world!";

    4.1.3. Пакеты



Классы в языке Java объединяются в пакеты. Все классы, входящие
в один пакет, являются дружественными по отношению друг к дру-
гу, то есть имеют взаимный доступ к переменным и методам, если
противное не оговорено явно посредством спецификаторов private
или protected.

Пакеты разграничивают пространства имен. "Просто глобальных"
имен в языке Java не бывает.

Пакет оформляется с помощью синтаксической конструкции вида

package my_packages.pack1:

Инструкция package должна стоять первой в файле с исходным
Java-текстом. Она действует до конца файла.

Пакеты могут импортироваться другими пакетами посредством инст-
рукции import. Примеры,

import java.util;
import java.util.HashTable;
import java.util.*;

Первая инструкция import позволяет обращаться к классам пакета
util следующим образом:

util.Vector
util.HashTable
. . .

Вторая инструкция импортирует лишь класс HashTable, позволяя в
дальнейшем обращаться к этому классу по короткому имени, без
префикса util.

Третья инструкция import позволяет обращаться по коротким име-
нам ко всем классам пакета util.

    4.1.4. Управляющие конструкции



Управляющие конструкции языка Java вполне традиционны, за иск-
лючением средств выхода из вложенных блоков (в частности, из
вложенных циклов). Пример.

test:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i > 3) {
break test;
}
}
}

Для передачи управления можно применять как конструкцию break,
так и continue (переход к следующей итерации цикла).

Инструкция goto в языке Java отсутствует.

    4.1.5. Исключительные ситуации



Для обработки исключительных ситуаций, возникающих во время вы-