Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
105
Добавлен:
30.03.2021
Размер:
42.12 Mб
Скачать

ГЛАВА 37

Компоненты Java Beans

В

этой

главе

представлен

краткий

обзор

компонентов

Java

Beans. Особое

зна­

чение

этих

программных

компонентов

состоит

в

том,

что

на

их основе

можно

создавать

сложные

системы

.

Эти

компоненты

можно

создавать

самостоятельно,

а

также

приобретать

в

готовом

виде

у

сторонних

производителей

.

Компоненты

Java

Beans

определяют

архитектуру,

устанавливающую

порядок

взаимодействия

стандартных блоков.

Чтобы стало понятнее

особое

значение

компонентов

Java Beans,

обратимся

к

аналогии.

В

распоряжении

разработчиков

оборудования

вычислительных

систем

имеются

разнообразные

компоненты,

из

которых

можно

построить

конкретную

вычислительную

систему

.

Резисторы,

конденсаторы

и

катушки

индуктивности

служат

примерами

простых

стандартных

блоков

.

Интегральные

схемы

предлагают

еще

больше

функциональных

возможностей.

При

этом

каждый

из

этих

компонен­

тов

можно

использовать

многократно

.

Их

не

нужно

компоновать

заново

всякий

раз,

когда

требуется

создать

новую

систему.

Кроме

того

, одни

и

те

же

компоненты

можно использовать в разнотипных схемах. И все это возможно потому, что

дение подобных компонентов заранее известно и хорошо документировано.

пове­

И

в

отрасли разработки

программного

обеспечения

предпринимались

попыт­

ки

воспользоваться

преимуществами

многократного

использования

компонентов

и

их

способностью

к

взаимодействию

.

Для

этого

необходимо

было

разработать

такую

архитектуру

компонентов,

которая

позволила

бы составлять

программы

из

стандартных

блоков,

в

том

числе и

предлагаемых

сторонними

производителями

.

Кроме

того,

разработчик

должен

был

иметь

возможность

выбрать

компонент,

ра­

зобраться

в

его

функциях

и

внедрить

его

в

приложение

.

А

после

выхода

новой

вер­

сии

компонента

нужно

было

обеспечить

простоту

внедрения

его

функциональных

возможностей

в

уже

существующий

прикладной

код

.

Именно

такую

архитектуру

и

предлагают

компоненты

Java

Beans.

Общее

представление

о

компонентах

Java

Beans

Java Beans

-

это

компоненты

программного

обеспечения,

предназначенные

для

многократного

применения

в

самых

разных

средах

.

На

функциональные

воз­

можности

компонентов

Java

Beans

не

налагается

никаких

ограничений

.

Они

могут

Глава

37.

Компоненты

Java

Beans

1391

Имеются

два

способа,

с

помощью

которых

разработчик

компонентов

Java

Beans

может

указать,

какие

именно

свойства,

события

и

методы

компонента

должны

быть

доступны.

Первый

способ

состоит

в

том,

чтобы

использовать

простые

услов­

ные

обозначения.

Они

позволяют

механизмам

самоанализа

логически

выводить

сведения

о

компонентах

Java

Beans.

Второй

способ

подразумевает

предоставление

дополнительного

класса,

расширяющего

интерфейс

Beaninfo.

Этот

класс,

в

свою

очередь,

предоставляет

нужные

сведения

о

компоненте

явным

образом.

Оба

спо­

соба

рассматриваются

в

последующих

разделах.

Проектные шаблоны для

компонентов Java Beans

свойств

Свойства

компонентов

Java

Beans

являются

подмножеством

их

состояния.

Значения,

присваиваемые

свойствам,

определяют

поведение

и

внешний

вид

ком­

понентов

Java

Beans.

Значение

свойства

задается

методом

установки,

а

извлекает­

ся

методом

получения.

Имеются

две

разновидности

свойств:

простые

и

индекси­

рованные.

Простые

свойства

по

У простого свойства имеется единственное значение.

Его можно распознать

приведенным ниже проектным шаблонам, где N -

имя

свойства; а т - его тип.

puЫic puЬlic

Т getN() void setN(T

аргумент);

Оба указанных

метода

имеются

у

каждого

свойства,

допускающего

чтение

и

за­

пись,

для

доступа

к его

значению.

У

свойства,

допускающего

только

чтение,

име­

ется

лишь

метод

получения,

а

у

свойства,

допускающего

только

запись,

-

лишь

метод установки.

 

В приведенном

ниже примере демонстрируются три простых свойства,

скающих чтение и

запись, а также их методы получения и установки.

допу­

private

douЫe

depth,

height,

width;

puЬlic

douЫe

getDepth()

return

depth;

puЬlic

void

depth

= d;

setDepth(douЫe

d){

puЬlic

douЫe

getHeight()

return

height;

puЫic

void

setHeight(douЫe

h)

{

height

=

h;

Глава

37.

Компоненты

Java Beans

1399

менение

интерфейса

Beaninfo,

а

также

классов

Introspector,

Property

Desciptor

и

EventSetDescriptor.

Данный

пример

состоит

из

трех

классов.

Первый класс

является компонентом Java Bean

казано, каким

образом определяется этот класс.

и

называется

Colors.

Ниже

по­

/!/

Простой

компонент

Java

Bean

import import import

java.awt.*; java.awt.event.*; java.io.SeI·ializaЬle;

puЬlic class Colors extends Canvas

 

implements SerializaЫe

{

 

 

transient private Color color;

//

несохраняемая переменная

private boolean rectangular;

//

сохраняемая переменная

puЫic Colors ()

 

 

addМouseListener(new

MouseAdapter()

puЬlic void

mousePressed(MouseEvent

change();

 

 

}

 

 

} ) ;

 

 

rectangular =

false;

 

setSize(200,

100);

 

change();

 

 

me)

puЬlic boolean getRectangular() return rectangular;

puЬlic void

setRectangular(boolean

this.rectangular

= flag;

repaint();

 

 

flag)

puЫic

void

change()

{

color

= randomColor();

repaint();

 

 

private

int

r

int

g

int

Ь

return

Color randomColor()

{

 

(int) (255*Math.random());

=

(int)(255*Math.random());

=

(int) (255*Math.random());

 

new Color(r, g, Ь);

 

puЬlic

void

paint(Graphics

g)

Dimension d = getSize();

 

int

h

=

d.height;

 

 

int

w

=

d.width;

 

 

 

g.setColor(color);

 

 

if(rectangular)

{

 

 

g.fillRect(O,

О,

w-1,

h-1);

Глава

38. Введение

в

сервлеты

1405

И

наконец,

сервер

может

принять

решение

выгрузить

сервлет

из

оперативной

памяти.

Для

принятия

такого

решения

на

каждом

сервере

применяются

разные

алгоритмы.

А

для

освобождения

таких

ресурсов,

как

дескрипторы

файлов,

вы­

деляемых

для

сервлета,

сервер

вызывает

метод

destroy

().

Важные

данные

мо­

гут

быть

сохранены

в

постоянном

хранилище.

Оперативная

память,

выделяемая

для

сервлета

и

его

объектов,

может

быть

впоследствии

утилизирована

в

процессе

"сборки

мусора':

Варианты

разработки

сервлетов

Для

разработки

сервлетов

потребуется

доступ

к

контейнеру

сервлетов

или

серверу

приложений.

Наиболее

популярными

из

них

являются

сервер

приложе­

ний

Glassfish

и

контейнер

сервлетов

Tomcat.

Сервер

приложений

Glassfish

предо­

ставляется

компанией

Oracle

в

комплекте

Java

ЕЕ

SDK.

Он

поддерживается

в

ИСР

NetBeans.

А

контейнер

сервлетов

Tomcat -

это

программный

продукт

с

открытым

исходным

кодом,

поддерживаемый

организацией

Apache Software Foundation.

Он

также

поддерживается

в

ИСР

NetBeans.

Контейнером

сервлетов

Tomcat

и

серве­

ром

приложений

Glassfish можно

пользоваться

и

в

других

ИСР,

например

Eclipse.

Несмотря

на то

что

такие

ИСР,

как

NetBeans

и

Eclipse,

способны

значительно

упростить

разработку

сервлетов,

здесь

и

далее

в

этой

главе

они

не

применяются.

В

разных

ИСР

разработка

и

развертывание

сервлетов

имеет

свои

отличия,

и

по­

этому

здесь

просто

невозможно

рассмотреть

все

эти

отличия.

Кроме того, многие

читатели,

скорее

всего,

будут

пользоваться

инструментальными средствами

ко­

мандной

строки,

а

не

ИСР.

Поэтому,

если вы

пользуетесь

ИСР,

за

справкой

о

разра­

ботке

и

развертывании

сервлетов

обращайтесь

к

документации

на

эту

ИСР.

А

все

приведенные

далее

пояснения

подразумевают,

что

для

разработки

сервлетов при­

меняются

только

инструментальные

средства

командной

строки.

Таким

образом,

они подойдут практических для любого читателя.

Контейнер сервлетов Tomcat применяется в этой

главе

потому,

что

выполнять

примеры

сервлетов,

используя

только

инструментальные

средства

командной

строки

и

текстовый

редактор,

по

мнению

автора,

проще

и

доступнее

в

разных

сре­

дах

программирования.

Кроме

того,

не

придется

загружать

и

устанавливать

ИСР

только

для

того,

чтобы

экспериментировать

с

сервлетами,

поскольку

для

этого

достаточно

инструментальных

средств

командной

строки.

Следует,

однако,

иметь

в

виду,

что

рассматриваемые

здесь

основные

принципы

разработки

сервлетов

вполне

пригодны

и

в

той

среде,

где

применяется

сервер

приложений

Glassfish.

Немного

отличаться

будет

лишь

механизм

подготовки

сервлета

к

тестированию.

Помните!

Наставления

по

разработке

и

развертыванию

сервлетов,

представленные

далее

в

этой

главе,

подразумевают

использование

только

контейнера

сервлетов

Tomcat

и

инструментов

командной строки. Если вы пользуетесь ИСР и другим контейнером

приложений, обратитесь к документации на свою среду.

сервлетов

или

сервером

Глава 38.

Введение в сервлеты

pw.close();

1425

Скомпилируйте данный сервлет.

ствия, что и в предыдущем разделе.

Чтобы

проверить

его,

выполните

те

же

дей­

На

заметку! Параметры

НТТР-запроса типа POST не включаются в состав URL, отправляемый веб­

серверу. В данном

примере браузер посылает серверу следующий URL: ht tp: / / localhost:

8080/ examples/ servlets/ servlet/ColorPostServlet. Имена и значения пара­

метров отправляются в теле НТТР-запроса.

Применение

сооkiе-файлов

А

теперь

рассмотрим

пример

разработки

сервлета,

чтобы

продемонстрировать

применение

сооkiе-файлов.

Этот

сервлет

вызывается

при

передаче

формы,

запол­

ненной

на

веб-странице.

Данный

пример

состоит

из

трех файлов,

перечисленных

в

табл.

38.15.

Таблица

38.15.

Файлы,

составляющие

пример

применения

сооkiе-файлов

Фailn AddCookie.html

AddCookieServlet.java

GetCookiesServlet.java

Описание

Дает пользователю возможность определить значение для сооkiе-файла, называемого МyCookie

Обрабатывает передачу формы из файла AddCookie. html

Отображает значения из сооkiе-файла

Ниже

приведен

исходный

код

разметки

веб-страницы

из

НТМL-файла

Add

Cookie.

html.

Эта

страница

содержит

текстовое

поле

для

ввода

значения,

а

так­

же

кнопку

для

передачи

заполненной

формы

на

обработку.

Если

щелкнуть

на

этой

кнопке,

значение

в текстовом

поле

будет

передано

сервлету

AddCookieServlet

по

НТТР-запросу

типа

POST.

<html>

 

 

 

<body>

 

 

 

<Center>

 

 

<form

name="Forml"

 

 

method="post"

 

 

action="http://localhost:8080/examples/servlets

 

/servlet/AddCookieServlet">

<B>Enter а value for

MyCookie:</B>

<input

type=textbox

 

name="data" size=25 value="">

<input

type=submit

value="Submit">

</form>

 

 

</body>

 

 

</html>

 

 

Ниже

приведен

исходный

код

сервлета

из

файла

AddCookieServlet.

j

ava.

Он

получает

сначала

значение

параметра

data,

а

затем

создает

объект

MyCookie

ПРИЛОЖЕНИЕ А

Применение документирующих комментариев в Java

Как

пояснялось

в

части

1 данной

книги,

в

языке

Java

поддерживаются

три

вида

комментариев

.

Двумя

первыми

являются комментарии

/

/

и

/

*

*/.

А

третий

вид

называется

документирующим

комментарием.

Такой

комментарий

начинается

с

последовательности

символов

/

**

и

завершается

последовательностью

символов

* /.

Документирующие

комментарии

позволяют

ввести

в

программу

сведения

о

ней

самой,

а

затем

извлечь

их

с

помощью

утилиты

j

avadoc,

входящей

в

состав

JDK,

и

разместить

в

НТМL-файле.

Документирующие

комментарии

упрощают

процесс

написания

документации

к

разрабатываемым

программам

.

Вам,

должно

быть,

уже

встречалась

документация,

составленная

с

помощью

утилиты

j

avadoc

,

поскольку

именно

она

использована

для

документирования

прикладного

интерфейса

Java API .

Начиная

с

версии

JDK

9,

в

утилите

j avadoc

поддерживается

также

документиро­

вание

модулей

.

Дескрипторы

утилиты

javadoc

Утилита

j

avadoc

распознает

дескрипторы,

перечисленные

в

табл.

А.1

.

Таблица

А.

1.

Дескрипторы

утилиты

j

avadoc

Дескриптор @author {@code}

@deprecated {@docRoot} @exception @hidden

{@index} {@inheri tDoc} {@link} {@linkplain}

Назначение

 

Идентифицирует автора

 

Отображает информацию в исходном виде, т.е. без обработки

стилей

НТМL-разметки, используя шрифт кода

 

Обозначает, что класс или его член не рекомендуется для применения

Обозначает путь к корневому каталогу текущей документации

 

Обозначает исключение, генерируемое методом или конструктором

Запрещает включение элемента кода в документацию (внедрен

в версии JDK 9)

 

Обозначает индексируемый термин (внедрен в версии JDK 9)

 

Наследует комментарий от непосредственного суперкласса

 

Вставляет встроенную ссылку на другую тему

 

Вставляет встроенную ссылку на другую тему, причем ссылка

 

отображается

обычным шрифтом

Приложение

А.

Применение

документирующих

комментариев

в

Java

1437

Дескриптор

{@value}

Имеет

две

формы.

В

первой

форме

отображается

значение

константы,

которая

предшествует

этому

дескриптору

и

должна

быть

статическим

(s

t

а

t

i

с)

полем.

Эта

форма

приведена

ниже.

{@value}

Во

второй

форме отображается

значение

конкретного

статического

поля.

Эта

форма

приведена

ниже,

где

параметр

пакет.

класс#поле

обозначает

имя

стати­

ческого

поля.

{@value

пакет.класс#поле}

Дескриптор

@version

Определяет

версию

класса

или

интерфейса.

Он

имеет

следующий

синтаксис:

@version

информация

Здесь

параметр

информация

обозначает

символьную

строку,

содержащую

све­

дения

о

версии

комментируемого

элемента

программы

(как

правило,

номер

вер­

сии,

например

2.2).

Запуская

утилиту

j

avadoc

на

выполнение,

следует

указать

па­

раметр

-version,

чтобы включить

поле

@version

в

НТМL-документацию.

Общая

форма

документирующих

комментариев

После

начальной

последовательности

символов

/ * *

первая

строка

(или

не­

сколько

строк)

становится

главным

описанием

комментируемого

класса,

интер­

фейса,

поля,

конструктора

или

метода.

После

нее

можно

ввести

один

или

несколь­

ко

различных

дескрипторов

@.

Каждый

дескриптор

@

должен

располагаться

в

на­

чале

новой

строки

либо

следовать

за

одним

или несколькими

знаками

звездочки

(*),с

которых

начинается

строка.

Несколько

дескрипторов

одного

и

того

же

типа

необходимо

сгруппировать

вместе.

Так,

если

имеются

три

дескриптора

@see,

их

следует расположить

один

за

другим.

Встроенные

дескрипторы,

начинающиеся

с

фигурной

скобки,

можно

разместить

в

пределах

любого

описания.

Ниже

приведен

пример

документирующего

комментария

к

классу.

!**

 

 

 

*

Этот класс строит

столбиковую

*

@author

Герберт

Шилдт

*

@version

3.2

 

 

*!

 

 

 

 

диаграмму

Результаты,

выводимые

утилитой

j avadoc

В

качестве

выводимых

данных

утилита

j

av

adoc

получает

файл

с

исходным

ко­

дом

прикладной

программы

на

Java

и

выводит

несколько

НТМL-файлов,

содержа­

щих

документацию

на

эту

программу.

Сведения

о

каждом

классе

будут

содержать-

Приложение

Б.

Краткий

обзор

Java

Web Start

1441

ру

аплетов,

предоставляя

методы

init

(),

start (),

stop

()

и

destroy

(),при­

ложения

Java

Web

Start

являются

обычными

клиентскими

проrраммами

вроде

тех,

примеры

которых

приводились

ранее

в

главах,

посвященных

библиотекам

Swing

и

JavaFX.

Иными

словами,

приложение

Java

Web Start,

по

существу,

является

пол­

нофункциональной

клиентской

прикладной

программой,

загружаемой

и

выпол­

няемой

из

веб.

Например,

прикладную

программу

JListDemo,

пример

которой

обсуждался

в

главе

32,

можно

выполнить

как

приложение

Java

Web

Start,

вообще

не

внося в нее никаких изменений.

Благодаря тому что Java Web Start

не

требует

применения

подключаемых

к

бра­

узерам

модулей,

для

установки

приложения

Java

Web

Start

на

главной

машине

тре­

буется

лишь

исполняющая

среда

JRE.

Тем

самым

исключаются

осложнения,

свя­

занные

с

отсутствием,

отключением

или

устареванием

подключаемых

модулей.

Приложение

Java

Web

Start

выполняется

в

настольной

системе,

а

не

в

браузере,

и

поэтому

оно

ничем

внешне

не

отличается

от

обычного

настольного

приложения.

Более

того,

как

только

приложение

Java

Web

Start

будет

загружено,

его

можно

вы­

полнить

в

автономном

режиме.

Имеется

также

возможность

создать

ярлык

для

та­

кого

приложения.

Откровенно

говоря,

технология

Java

Web

Start

позволяет

разра­

ботчикам

создавать

приложения

с

намного

более

обширными

функциональными

возможностями, чем у аплетов.

По умолчанию приложения

Java

Web

Start

выполняются

в

той

же

самой

"пе­

сочнице"

системы

защиты,

что

и

неподписанные

аплеты,

а следовательно,

на

них

налагаются

те

же

самые

ограничения.

Это

означает,

что

по

умолчанию

приложения

Java

Web

Start

обеспечивают

такую

же

защиту,

как

и

неподписанные

аплеты.

Но

приложение

Java

Web

Start

можно,

если

потребуется,

снабдить

дополнительными

полномочиями

доступа.

Главные

элементы

Java

Web

Start

И

хотя

с

развертыванием

приложений

по

технологии

Java

Web

Start

связано

не­

мало

средств,

методик

и

особенностей,

среди

них

можно

все

же

выделить

четыре

главных

элемента.

Во-первых,

приложение

Java

Web

Start

должно

быть

упакова­

но

в

архивный

JАR-файл.

Во-вторых,

архивный

JАR-файл

должен

быть

непремен­

но

подписан.

В-третьих,

необходимо

создать

JNLР-файл

со

сведениями

о

запуске

приложения. И, в-четвертых, для запуска приложения на JNLР-файл. Все эти главные элементы Java Web Start

обычно создается ссылка более подробно описыва­

ются

в

последующих

разделах.

Упаковка приложений Java Start в архивный JАR-файл

Web

Все приложения Java Web Start должны быть непременно

упакованы в архив­

ный JАR-файл. Как пояснялось ранее в

данной книге, сокращение JAR обозначает

Java ARchive, т.е. архив Java. Архивный

JАR-файл создается с

помощью утилиты

1448

Часть

VI.

Приложения

примере требуется

зано ниже.

лишь

один

из

них

для

указания

хранилища

ключей,

как

пока­

jarsigner

-keystore

devKeys

ToggleButtonDemo.jar

devName

Здесь случае -

параметр keystore обозначает

файл хранилища ключей

(в данном

devKeys). А далее следует имя

ToggleBut tonDemo. j ar

подписы­

ваемого

архивного

JАR-файла

и

псевдоним

сертификата.

При

выполнении

при­

веденной

выше

команды

вам

будет

предложено

ввести

пароль,

указанный

вами

на

предыдущей

стадии

рассматриваемого

здесь

процесса.

Имейте

в

виду,

что

вся­

кий

раз,

когда

вы

вносите

изменения

в

архивный

JАR-файл,

его

придется

подпи­

сывать

снова.

Помните!

Несмотря

на

то

что

самозаверение

удобно

для

целей

демонстрации

процедуры

подписания

архивного

JАR-файла,

самозаверенный

сертификат

непригоден

для

развертывания

реально­

го

приложения,

поскольку

для

этой

цели

требуется

сертификат,

полученный

из

полномочно­

го

центра

сертификации.

Более

того,

самозаверенное

приложение,

созданное

кем-то

другим,

представляет

немалый

риск нарушения

безопасности.

Поэтому

выполнять

самозаверенные

приложения,

созданные

другими,

как

правило,

следует

с

большой осторожностью!

Создание

JNLР-файла

для

запуска

приложения

ToggleBut

tonDemo

На

следующей

стадии

рассматриваемого

здесь

процесса

необходимо

создать

JNLР-файл

для

запуска

приложения

ToggleButtonDemo.

Ниже

приведено

со­

держимое

представленного

ранее

JNLР-файла.

Несмотря

на

всю

его

простоту,

он вполне

подходит

для

целей

данного

примера.

Присвойте

этому

файлу

имя

ToggleButtonDemo.jnl~

<?xml

version="l.0"

encoding="UTF-8"?>

<jnlp

href="JListDemo.jnlp"

sрес="б.0+">

<!-- Это описание

приложения -->

<application-desc

main-class="JListDemo">

</application-desc>

<!-- Ресурсы, требующиеся в приложении-->

<resources>

 

<!--

Это

обозначение

архивного

JАR-файла

<jar

приложения JListDemo. href="JListDemo.jar"

--> main="true"/>

<!--

Обозначение

<java

version="l

</resources>

минимальной .8+"/>

версии

Java

-->

<!-- Сведения

о данном приложении.

-->

<information>

 

 

 

<!-- Эти сведения появляются

в кеш-списке

панели

управления Java.

-->

 

на

Приложение

В.

Утилита

JShell

1455

/edit

3.

И,

наконец,

в

данной

команде

можно

указать

именованный

элемент

кода

(например,

переменную).

Так,

если

требуется

изменить

значение

переменной

coun t, следует ввести команду / edi t count.

Как было показано ранее, код выполняется

в

JShell

по

мере

его

ввода.

Но

вве­

денный

ранее

код

можно

выполнить

повторно.

Например,

чтобы

повторно

вы­

полнить

введенный

последним

фрагмент

кода,

достаточно

ввести

команду

/

! .

А

для

того

чтобы

повторно

выполнить

конкретный

фрагмент

кода,

следует

ввести

команду

/n,

где n

обозначает

выполняемый

фрагмент

кода.

Так,

если

требуется

выполнить

четвертый

фрагмент

кода,

достаточно

ввести

команду

/ 4.

Кроме того,

повторно

выполнить

фрагмент

кода

можно,

указав

его

позицию

относительно

те­

кущего

фрагмента

с

отрицательным

смещением.

Например,

чтобы

повторно

вы­

полнить

фрагмент

кода,

отстоящий

на

три

фрагмента

от

текущего,

достаточно

вве­

сти команду /-3.

Имеется еще одна важная команда, о которой следует знать, приступая

с JShell. Это команда / exi t, по которой происходит выход из JShell.

к

работе

Ввод

метода

но

Как пояснялось в главе 6, методы выполняются в классах. Но если в JShell мож­ экспериментировать с методом, не объявляя его непосредственно в классе. Как

упоминалось

ранее,

это

возможно

благодаря

тому,

что

вводимые

фрагменты

кода

автоматически

заключаются

в

оболочку

синтетического

класса.

Это

дает

возмож­

ность

легко

и

быстро

написать

метод

без

помощи

структуры

класса.

Кроме

того,

метод

можно

вызвать,

не

создавая

объект.

Такая

возможность

JShell

особенно

удоб­

на

для

изучения

основ

объявления методов

в

Java

или

проверки

вновь

написанного

кода. Чтобы этот процесс стал понятнее, обратимся к конкретному примеру. Итак, начните сеанс работы в JShell и введите по приглашению следующий

ме­

тод:

douЫe reciprocal return l.0/val;

(douЫe

val)

{

В

итоге

будет

автоматически

создан

метод,

возвращающий

обратную

величину

своего

аргумента.

На

его

ввод

JShell

отреагирует

приведенным

ниже

сообщени­

ем,

где

указывается

на

то,

что

данный

метод

введен

в

синтетический

класс

и

готов

к

применению.

created method

reciprocal(douЬle)

Чтобы

вызвать

метод

reciprocal (),достаточно

указать

только

его

имя

без

всякой

ссылки

на

объект

или

класс.

Для

примера

попробуйте

ввести

приведенную

ниже

строку

кода,

в

ответ

на

что

JShell

выведет

результирующее

значение

О.

2

5.

System.out.println(reciprocal(4.0));

Если

вас

интересует,

каким

образом

можно

вызвать

метод

reciprocal

(),

не

прибегая

к

операции-точке

или

ссылке

на

объект,

на

это

можно

ответить

следую-

Приложение

В.

Утилита

JShell

1461

однако,

иметь

в

виду,

что

по

команде

/reset

в

исходное

состояние

устанавлива­

ется вся среда JShell в целом, и поэтому теряется вся информация о состоянии. Сохранить сеанс работы в JShell можно по команде / save. Ниже приведена

ее

простейшая

форма.

/save

имя_файла

Здесь

имя_

файла

обозначает

имя

сохраняемого

файла.

По

умолчанию

при

вы­

полнении

команды

/

save

сохраняется

текущий

фрагмент

кода,

хотя

в

ней

под­

держиваются

три

параметра,

два

из

которых

представляют

особый

интерес.

Так,

указав

параметр

-all,

можно

сохранить

все

введенные

строки

кода,

включая

и

те,

что были введены неверно, а указав параметр -history, -

сохранить предысто­

рию сеансов работы в JShell, т.е. перечень введенных ранее команд.

Загрузить отдельный сеанс работы в JShell можно по команде / open. Ее общая

форма

имеет

следующий

вид:

/open

имя_файла

Здесь имя_файла обозначает имя загружаемого файла.

В утилите JShell предоставляется также ряд команд, по которым

можно

перечис­

лять

различные

элементы

разрабатываемой

программы.

Эти

команды

nеречислены

в

табл.

В.1.

Таблица

8.1.

Команды

JShell

для

отображения

различных

элементов

кода

/types /imports /methods /vars

Отображает Отображает Отображает Отображает

классы, интерфейсы операторы импорта методы переменные

и

перечисления

Так,

если

ввести

сначала

следующие

строки

кода:

int int int

start end = count

= О;

10; = 5;

а

затем

команду

/vars,

то

на

консоль

будет

выведен

следующий

результат:

int

start

=

О;

1

int

end

=

10;

1

int count

=

5;

Нередко

используется

также

команда

/history.

По

этой

команде

можно

про­

смотреть

предысторию

текущего

сеанса

работы

в

JShell.

Эта

предыстория

состоит

из

перечня

команд,

введенных

ранее

по

приглашению

JShell.

Дальнейшее

изучение

JShell

Чтобы

научиться

грамотно

пользоваться

утилитой

JShell,

лучше

всего

приме­

нять

ее

на

практике.

В

частности,

попробуйте

ввести

несколько

различных

кон­

струкций

Java

и

понаблюдать,

как

на

них

реагирует

JShell.

Экспериментируя

с

JShell,

Приложение Г. Аплеты

 

11

Нажата кнопка

Beta

 

 

 

}

 

 

 

 

 

 

 

} )

;

 

 

 

 

 

 

 

11

ввести

кнопки н

а

панел

и

содержимого

add ( j btnAlpha) ;

 

 

 

 

add(jbtnBeta) ;

 

 

 

 

11

создать

текстовую

метку

 

jl ab =

new

JLabel(

" Press

а

butto n . " );

 

11

Метка

" Нажмите кно

пку. "

11

ввести

ме

тки на

панели

 

содержимого

add ( j lab) ;

 

 

 

 

 

 

1471

в

На рис. Г.2 показан результат

выполнения

окне утилиты appleteviewer .

 

Swing-aплeтa

из

данноrо

примера

Appl~Vitwer.

".

~

Applet

1

Alpha

1~

Alpha

\Vas

pressed.

Applet started.

Рис.

Г.2.

Результат

выполнения

примера

Swing-aплeтa

В

отношении

аплетов

следует

сделать

два

важных

замечания

.

Во-первых,

класс

MySwingApp

l

et

расширяет

класс

JApple

t.

Как

пояснялось

ранее

,

все

аплеты,

построенные

на

основе

библиотеки

Swing,

расширяют

класс

JApp

l

et

,

а

не

класс

Applet

.

И,

во-вторых,

метод

in

i

t

()

инициализирует

компоненты

Swing

в

пото­

ке

диспетчеризации

событий,

устанавливая

вызов

метода

ma k eGUI

()

.

Обратите

внимание

на

то

,

что

для

этой

цели

служит

метод

invo

k eAn d Wa i t

(

),а

не

in

vo

k e

Late

r

()

.Метод

i

nvokeA

n dW a

it

()

следует

применять

в

аплетах

потому,

что

возврат

из

метода

in

i

t

()

не

должен

происходить

до

тех

пор

,

пока

не

завершит

­

ся

весь

процесс

инициализации.

По

существу,

метод

s

t а r t

( )

нельзя

вызывать

до

завершения

инициализации,

а

это

означает,

что

прежде

нужно

полностью

по­

строить ГПИ.

В методе ma k eGUI

()

создаются

две

кнопки

и

метка,

а

также

вводятся

прием­

ники

действий

от

этих

кнопок

.

И,

наконец,

компоненты

вводятся

на

панели

со­

держимоrо. Несмотря на всю простоту данноrо примера, демонстрируемый

принцип следует применять при построении любоrо ГПИ для Swing-aплeтa.

в

нем

ПРИЛОЖЕНИЕ

ДДва главных новых средства в Java 10

Вэтом приложении к десятому изданию книги описываются два главных функциональных средства, внедренных в версии JDK 10. Это сделано потому, что в графике выпуска версий Java произошли существенные изменения. В прошлом главные версии Java обычно выпускались через каждые два года или больше лет. Но после выпуска версии Java SE 9 (JDK 9) промежуток времени между выпусками главных версий Java сократился. Начиная с версии Java SE 10 (JDK 10), очередная главная версия будет появляться строго по графику лишь через шесть месяцев после предыдущей.

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

На момент написания данной книги выпуск функциональных версий планировался на март и сентябрь каждого года. Версия JDK 10 была выпущена в марте 2018 года, т.е. через шесть месяцев после выпуска версии JDK 9. А следующий выпуск намечен на сентябрь 2018 года. Таким образом, новая функциональная версия будет появляться через каждые шесть месяцев. Из-за столь ускоренного графика выпуска некоторые версии будут обозначены как обеспечиваемые долгосрочной поддержкой (LTS). Это означает, что такая версия будет поддерживаться в течение определенного по длительности периода времени. А остальные функциональные версии считаются краткосрочными. Таким образом, обе версии JDK 9 и JDK 10 обозначены в настоящий момент как краткосрочные, а в сентябре 2018 года ожидается выпуск версии с долгосрочной поддержкой. Обращайтесь за самой последней информацией к электронной документации по Java.

Настоящее, десятое издание было обновлено по версии JDK 9. Нетрудно догадаться, что для внесения исправлений в книгу может потребоваться немало времени. Но еще до выхода в свет следующего издания книги в версии JDK 10 было внедрено немало новых функциональных и языковых средств, два из которых немедленно привлекут особое внимание всех программирующих на Java. Именно по-

1490 Часть VI. Приложения

этому они и стали предметом рассмотрения в этом приложении. Первое средство называется выведением типов локальных переменных. Оно имеет особое значение, поскольку оказывает заметное влияние на синтаксис и семантику языка Java. А второе средство, внедренное в JDK 10 и описываемое здесь, имеет отношение

кизменениям в схеме обозначения номеров версий комплекта JDK. Эти изменения поддерживают повременный график выпуска и изменение назначения элементов в номерах версий. Изменения номеров версий оказывают также влияние на класс Runtime.Version, инкапсулирующий сведения о версиях.

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

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

Выведение типов локальных переменных

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

Чтобы воспользоваться выведением типов локальных переменных, достаточно указать в объявлении такой переменной имя типа var и ее инициализатор. Например, в прошлом локальная переменная counter типа int, инициализируемая значением 10, объявлялась следующим образом:

int counter = 10;

Используя выведение типов, приведенное выше объявление переменной можно теперь переписать таким образом:

var counter = 10;

Вобоих случаях переменная counter будет отнесена к типу int. Но если

впервом случае ее тип указывается вручную, то во втором случае он выводится автоматически, поскольку инициализатор 10 относится к типу int.

Как упоминалось выше, идентификатор var был внедрен как контекстнозависимый. Если он применяется в качестве имени типа в контексте объявления

Приложение Д. Два главных новых средства в Java 10 1491

локальной переменной, то предписывает компилятору воспользоваться выведением типов, чтобы определить тип объявляемой переменной на основании типа ее инициализатора. Таким образом, идентификатор var служит меткой-заполните- лем конкретного, выводимого типа данных. Но в большинстве других мест применения в исходном коде идентификатор var просто считается определяемым пользователем и не имеет никакого особого значения. Например, следующее объявление переменной считается вполне допустимым:

int var = 1; // В этом случае var - это просто

//определяемый пользователем идентификатор

Вданном случае тип int указывается явно, а var обозначает имя объявляемой переменной. Но, несмотря на то что var является контекстно-зависимым идентификатором, его применение в некоторых местах исходного кода не допускается.

Вчастности, его нельзя применять в качестве имени класса, интерфейса, перечисления или аннотации.

Все сказанное выше воплощается в следующем примере программы:

//Простой пример, демонстрирующий выведение типов

//локальных переменных

class VarDemo {

public static void main(String args[]) {

//Применить выведение типов, чтобы определить тип

//переменной counter. В данном случае выводится

//тип int

var counter = 10;

System.out.println("Значение переменной counter: "

+counter);

//В следующем контексте var - это не предопределенный

//идентификатор, а просто определяемое пользователем

//имя переменной

int var = 1;

System.out.println("Значение переменной var: " + var);

//Любопытно, что в следующих строках кода var

//обозначает не только тип, но и имя объявляемой

//переменной в ее инициализаторе

var k = -var;

System.out.println("Значение переменной k: " + k);

}

}

Ниже приведен результат выполнения данной программы:

Значение переменной counter: 10 Значение переменной var: 1 Значение переменной k: -1

В приведенном выше примере идентификатор var применяется для объявления лишь простых переменных, но с его помощью можно объявить и массив, как демонстрируется в следующей строке кода:

var myArray = new int[10]; // Вполне допустимо

1492 Часть VI. Приложения

Обратите внимание на отсутствие квадратных скобок рядом с идентификаторами var и myArray. Вместо этого тип массива myArray автоматически выводится как int[]. Более того, в левой части объявления с идентификаторами var вообще не допускается указывать квадратные скобки. Следовательно, оба приведенных ниже объявления массивов недопустимы.

var[] myArray = new int[10]; // Неверно! var myArray[] = new int[10]; // Неверно!

В первой из приведенных выше строк кода предпринимается попытка присоединить квадратные скобки к идентификатору var, а во второй строке — к имени массива myArray. Но в обоих случаях применять квадратные скобки нельзя, поскольку типа массива автоматически выводится из типа его инициализатора.

Важно подчеркнуть, что объявить переменную с помощью идентификатора var можно лишь в том случае, если она инициализируется. Например, следующий оператор недопустим:

var counter; // Неверно! Требуется инициализатор

Не следует также забывать, что с помощью идентификатора var можно объявлять только локальные переменные. Его нельзя использовать, например, для объявления полей, параметров, передаваемых методам, или возвращаемых из них значений.

Выведение ссылочных типов локальных переменных

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

var myStr = "This is a string";

Как упоминалось выше, к преимуществам выведения типов локальных переменных относится возможность рационализировать исходный код, что особенно очевидно в отношении ссылочных типов данных. Рассмотрим в качестве примера следующее объявление переменной, написанное традиционным способом:

FileInputStream fin = new FileInputStream("test.txt");

С помощью идентификатора var это же объявление переменной можно переписать следующим образом:

var fin = new FileInputStream("test.txt");

Здесь автоматически выводится тип FileInputStream переменной fin, поскольку именно к этому типу относится ее инициализатор. В этом случае отпадает необходимость повторять имя ссылочного типа в левой части объявления переменной fin, а следовательно, оно становится значительно более кратким, чем на-

Приложение Д. Два главных новых средства в Java 10 1493

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

Безусловно, выведением типов локальных переменных можно воспользоваться и в определяемых пользователем классах, как демонстрируется в следующем примере программы:

//Выведение типов локальных переменных в определяемых

//пользователем типах классов

class MyClass { private int i;

MyClass(int k) { i = k;}

int geti() { return i; }

void seti(int k) { if(k >= 0) i = k; }

}

class VarDemo2 {

public static void main(String args[]) {

var mc = new MyClass(10); // Обратите здесь внимание

// на применение идентификатора var

System.out.println("Значение переменной i в "

+ "переменной mc равно " + mc.geti());

mc.seti(19);

System.out.println("Значение переменной i в "

+ "переменной mc теперь равно " + mc.geti());

}

}

Здесь переменная mc будет иметь тип MyClass, поскольку это тип ее инициализатора. Ниже приведен результат выполнения данного примера программы.

Значение переменной i в переменной mc равно 10 Значение переменной i в переменной mc теперь равно 19

Выведение типов локальных переменных и наследование

Очень важно не запутаться при выведении типов локальных переменных в иерархиях наследования. Как пояснялось ранее в данной книге, по ссылке из суперкласса можно обратиться к объекту производного класса, и такая возможность является составной частью поддержки полиморфизма в Java. Но очень важно не забывать, что тип переменной выводится, исходя из объявленного типа ее инициализатора. Так, если инициализатор относится к типу суперкласса, то именно к этому типу и будет выведена объявляемая переменная. При этом не имеет никакого значения, является ли конкретный объект, на который ссылается инициализатор, экземпляром производного класса. Рассмотрим в качестве примера следующую программу:

1494 Часть VI. Приложения

//Пользуясь наследованием, следует иметь в виду, что

//выводимый тип соответствует объявляемому в

//инициализаторе типу, который может и не быть самым

//нижним в иерархии производным типом, на который

//ссылается инициализатор

class MyClass { // ...

}

class FirstDerivedClass extends MyClass { int x;

// ...

}

class SecondDerivedClass extends FirstDerivedClass { int y;

// ...

}

class VarDemo3 {

// возвратить тип объекта класса MyClass static MyClass getObj(int which) {

switch(which) {

case 0: return new MyClass();

case 1: return new FirstDerivedClass(); default: return new SecondDerivedClass();

}

}

public static void main(String args[]) {

//Несмотря на то что метод getObj() возвращает

//разные типы объектов в иерархии наследования

//класса MyClass, в этом методе объявлен возвращаемый

//тип MyClass. Таким образом, во всех приведенных

//здесь случаях выводится тип переменных MyClass,

//несмотря на то что получаются объекты разных

//производных типов

//Здесь метод getObj() возвращает объект типа MyClass var mc = getObj(0);

//А здесь возвращается объект типа FirstDerivedClass var mc2 = getObj(1);

//Но здесь возвращается объект типа SecondDerivedClass var mc3 = getObj(2);

//Для обеих переменных mc2 и mc3 выводится тип MyClass,

//поскольку в методе getObj() объявлен возвращаемый

//тип MyClass, и поэтому ни переменной mc2, ни

//переменной mc3 недоступны поля, объявленные в

//классе FirstDerivedClass или SecondDerivedClass

//mc2.x = 10; // Неверно! В классе MyClass нет поля x

Приложение Д. Два главных новых средства в Java 10 1495

// mc3.y = 10; // Неверно! В классе MyClass нет поля y

}

}

В приведенном выше примере программы создается иерархия, состоящая из трех классов. На ее вершине находится класс MyClass, далее следует подкласс FirstDerivedClass, производный от класса MyClass, и, наконец, подкласс

SecondDerivedClass, производный от класса FirstDerivedClass. Затем в данной программе применяется выведение типов для создания трех переменных mc, mc2 и mc3 путем вызова метода getObj(). И хотя метод getObj() объявлен с возвращаемым типом MyClass (суперкласса), он на самом деле возвращает

объекты типа MyClass, FirstDerivedClass или SecondDerivedClass в зависимости от значения передаваемого ему аргумента. Таким образом, выводимый тип определяется типом, возвращаемым из метода getObj(), а не конкретным типом получаемого объекта.

Выведение типов локальных переменных и обобщения

Как пояснялось в главе 14, один из видов выведения типов уже поддерживается в обобщениях с помощью ромбовидной операции <>. Тем не менее в обобщенных классах можно пользоваться выведением типов локальных переменных. Так, если имеется следующий обобщенный класс:

class MyClass<T> { // ...

}

то приведенное ниже объявление переменной вполне допустимо.

var mc = new MyClass<Integer>();

В данном случае выводится тип MyClass<Integer> переменной mc. Следует также иметь в виду, что благодаря применению идентификатора var объявление переменной оказывается более кратким, чем обычно. В общем, имена обобщенных типов могут быть довольно длинными, а иногда и замысловатыми. Но с помощью идентификатора var такие объявления можно существенно сократить.

И еще одно важное замечание: идентификатор var нельзя применять в качестве имени параметра типа. Например, следующая строка кода недопустима:

class MyClass<var> { // Неверно!

Выведение типов локальных переменных в циклах и операторах try

Применение выведения типов локальных переменных не ограничивается только отдельными объявлениями, как демонстрировалось в приведенных выше примерах кода. Его можно также применять в циклах и операторе try с ресурсами. Рассмотрим оба эти случая по очереди.

1496 Часть VI. Приложения

Выведение типов локальных переменных можно использовать при объявлении и инициализации переменной управления традиционным циклом for или при указании итерационной переменной в цикле в стиле for each. И то, и другое демонстрируется в следующем примере программы:

// Применение выведения типов в цикле for class VarDemo4 {

public static void main(String args[]) {

// Вывести тип переменной управления циклом System.out.print("Значения переменной x: "); for(var x = 2.5; x < 100.0; x = x * 2)

System.out.print(x + " ");

System.out.println();

// Вывести тип итерационной переменной int[] nums = { 1, 2, 3, 4, 5, 6};

System.out.print("Значения в массиве nums: "); for(var v : nums)

System.out.print(v + " ");

System.out.println();

}

}

Ниже приведен результат выполнения данной программы:

Значения переменной x: 2.5 5.0 10.0 20.0 40.0 80.0 Значения в массиве nums: 1 2 3 4 5 6

Вданном примере выводится тип double переменной управления циклом x, поскольку именно к этому типу относится ее инициализатор. А для итерационной переменной v выводится тип int, поскольку к этому типу относится элемент массива nums.

Воператоре try с ресурсами тип ресурсам может быть выведен из его инициализатора. Например, приведенный ниже оператор вполне допустим. В данном примере выводится тип FileInputStream переменной fin, поскольку именно

кэтому типу относится ее инициализатор.

try( var fin = new FileInputStream("test.txt")) {

// ...

}catch(IOException exc) { // ... }

Некоторые ограничения

на применение идентификатора var

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

Приложение Д. Два главных новых средства в Java 10 1497

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

var myArray = new int[10]; // Допустимо!

а приведенная ниже строка кода недопустима.

var myArray = { 1, 2, 3 }; // Неверно!

И, наконец, выведение типов локальных переменных нельзя применять при объявлении типа исключения, перехватываемого оператором catch.

Обновления в схеме обозначения номеров версий JDK и классе Runtime.Version

С выпуском версии JDK 10 назначение номера версии комплекта JDK изменилось, чтобы лучше соответствовать ускоренному повременному графику выпуска, описанному в начале этого приложения. В прошлом номер версии JDK обозначался в хорошо известном формате основной_номер_версии.дополнительный_

номер_версии. Но такой формат не вполне отвечает новой периодичности выпуска. В итоге отдельные элементы номера версии получили другое назначение. Начиная с версии JDK 10, первые четыре элемента номера версии обозначают отсчет в следующем порядке: функциональная версия, промежуточная версия, обновленная версия, исправленная версия. Каждое число, обозначающее отсчет соответствующей версии, отделяется точкой, но конечные нули с предшествующими точками исключаются из номера версии. И хотя в номер версии могут быть включены дополнительные элементы, значение имеют лишь первые четыре предопределенных элемента.

Отсчет функциональной версии обозначает ее номер. Этот отсчет обновляется

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

с10. Таким образом, отсчет функциональной версии JDK 10 равен 10.

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

1498 Часть VI. Приложения

Следует отметить, что описанный выше номер версии является необходимой составляющей строки версии, хотя в нее могут быть включены и дополнительные элементы. Например, в строку версии могут быть включены сведения о предварительной версии. Дополнительные элементы указываются в строке версии после номера версии.

В версии JDK 9 в прикладной интерфейс Java API был внедрен класс Runtime. Version. Его назначение — инкапсулировать те сведения о версии, которые относятся к среде выполнения Java. Начиная с версии JDK 10, класс Runtime.Version был обновлен, чтобы включить в него следующие методы, поддерживающие новые значения отчета функциональной, промежуточной, обновленной и исправленной версии соответственно:

int feature() int interim() int update() int patch()

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

//Продемонстрировать отсчет версий

//в классе Runtime.Version

class VerDemo {

public static void main(String args[]) { Runtime.Version ver = Runtime.version();

// Отобразить отсчет отдельных версий System.out.println("Отсчет функциональной версии: "

+ ver.feature()); System.out.println("Отсчет промежуточной версии: "

+ ver.interim()); System.out.println("Отсчет обновленной версии: "

+ ver.update()); System.out.println("Отсчет исправленной версии: "

+ ver.patch());

}

}

В результате изменений в повременных выпусках следующие методы из класса Runtime.Version больше не рекомендованы к применению: major(), minor() и security(). Раньше эти методы возвращали основной номер версии, дополнительный номер версии и номер обновления безопасности соответственно. Вместо этих номеров теперь употребляются номера функциональной, промежуточной и обновленной версий, как описано выше.

изображения,

 

обработка, 1035

классы, разновидности, 948

кнопки-переключатели,

создание

 

и применение,

991

компоненты,

 

применение, 980

меню, создание

 

и применение,

1023

метки, создание

 

и применение,

981

оrраниченность,1186

помержка графики, 957

полосыпрокруrки,создание

и применение,

999

раскрывающиеся

списки, создание

и применение,

992; 995

строки и пункты

 

меню, создание

и применение,

1023

текстовые области, создание

и применение,

1005

текстовые поля, создание

и применение,

1002

тяжеловесные, 1186

флажки, создание

и применение,

988

цветовая система, 963

экранные кнопки, создание

и применение,

983

JavaFX

 

ввод изображений

в экранные кнопки, 1306

внедрение,54;1277

воспроизведение

изображений на месте

меток, 1304

 

графы сцены, 1279

деревья, создание

и применение,

1342

дополнительные

средства,1385

 

запуск приложений, 1281

изображения,

 

помержка, 1306

кнопки-переключатели,

создание

 

и применение,

1312

комбинированные списки,

составление и

применение,

1331

 

компиляция и выполнение

приложений, 1285

меню, помержка, 1355

метки, создание

 

и применение, 1286

неопределенное

состояние

флажков, разрешение, 1321

обработка событий, 1289

одновременный

выбор из

списка,активизация,1330

Предметный указатель

1473

отключение элементов

управления,

1354

панели компоновки,

разновидности,1279

переключатели, создание

и применение, 1309

ПОДМОСТКИ и сцены, 1279

комбинированные

списки, составление

и применение, 1354

представления

списков, создание

и применение, 1325

преобразования,

выполнение,

1349

прокручиваемые

панели, создание

и применение, 1338

разработка,стадии,1278

рисование в режиме

удержания, 1294

списки прокручиваемые,

создание

 

и применение, 1329

структура приложений, 1281

текстовые поля, создание

и применение, 1335

узлы, разновидности, 1279

фильтры событий,

реализация,

1290

флажки, создание

и применение, 1321

цепочка диспетчеризации

собьггий, 1290

экранные кнопки, создание

и применение, 1290

элементы управления,

классы, 1301

 

эффекты, применение, 1348

Swiпg

 

главные особенности, 1186

действия,применение,1262

другие компоненты,

назначение,

1274

классы компонентов, 1207

кнопки, классы, 1211

компоненты и

контейнеры,

назначение,

1189

лекговесные

 

компоненты, 1187

меню, система, 1239

обработка событий,

механизм, 1197

подключаемые стили

оформления, 1187

построение на основе

AWT, 1186

 

представитель

пользовательского

интерфейса, 1188

приложения и

аплеты, 1192

происхождение,1185

структура приложений, 1192

классов, встроенные,

78

 

Блоки кода

 

 

 

 

назначение, 74

 

 

 

 

обозначение, 74

 

 

 

в

 

 

 

Ввод-вывод

 

 

 

 

адресаты вывода,

 

 

 

определение, 795

 

 

буферизованный,

 

 

механизм, 817

 

 

 

ввод данных с

консоли,

 

организация, 383

 

 

возврат в поток ввода,

 

механизм, 820

 

 

 

вывод данных

на

консоль,

 

организация, 386

 

 

источники ввода,

 

 

определение,795

 

 

канальный, в файл, 865

 

консольный

 

 

 

 

помержка в

/ava, 395

 

применение,

69

 

 

 

организация в Java

851

 

новая система NIO,

 

потоковая система,

795

 

потоковый

 

 

 

 

в системе NIO,

876

 

 

организация,

 

 

традиционный,

795

 

 

организация,

 

 

через сеть, 891

 

 

 

системаNIО

 

 

 

 

буферы, назначение

 

и свойства, 852

 

 

каналы, назначение

 

 

и получение, 855

 

 

копирование файлов, 875

 

наборы символов, кодеры

и декодеры, 856

 

 

новый канальный ввод­

 

вывод, 865

 

 

 

 

операции в файловой

 

системе, 879

 

 

 

потоковый ввод-вывод, 876

применение,

852; 864

 

селекторы, назначение, 856

усовершенствования

 

в версии NI0.2, 856

 

Веб

 

 

 

 

сооkiе-файлы

 

 

 

 

назначение,905;1419

 

применение,

1425

 

 

содержимое, 1420

 

 

URL

 

 

 

 

назначение,898;905

898

формат и составляющие,

назначение, 898

 

 

 

Векторы

 

 

 

 

емкость, определение, 710

 

инкремент, задание, 710

 

применение, 712

 

 

 

создание, 709

 

 

 

 

List

 

 

 

 

 

 

методы,640

 

 

 

 

 

назначение,640

 

 

Listlterator

 

 

 

 

 

 

методы,662

 

 

 

 

 

назначение и

реализация,

662

применение,

664

 

 

ListModel, назначение, 1226

 

ListSelectioпlisteпer,

 

 

назначение,

реализация

 

и методы,

1227

 

 

ListSelectioпModel, назначение

и константы, 1226

 

 

Lock

 

 

 

 

 

 

методы, 1097

 

 

 

 

назначение

 

 

 

 

 

и реализация, 1096

 

 

Мар

 

 

 

 

 

 

методы, 673

673

 

 

назначение,

 

 

Map.Entry

 

 

 

 

 

 

методы,680

 

 

 

 

 

назначение,

679

 

 

Mouselistener,

назначение

 

и методы,

930; 1256

 

 

MouseMotionlistener,

930

назначение

и методы,

MouseWheellistener,

931

 

назначение

и методы,

 

MutaЬleComboBoxМodel,

 

назначение

 

 

 

 

 

и реализация,

1230

 

 

MutaЬleTreeNode, назначение,

реализация

и методы,

1233

NavigaЬleMap

 

 

 

 

 

методы,677

 

 

 

 

 

назначение,

677

 

 

NavigaЬleSet

 

 

 

 

 

 

методы,644

 

 

 

 

 

назначение,

644

 

 

Objectlnput,

назначение

 

 

и методы,

845

 

 

 

ObjectOutput,

назначение

 

и методы,

844

 

 

 

OpenOption, назначение

 

и реализация,

860

 

 

Path

 

 

 

 

 

 

методы, 857

 

 

 

 

 

назначение,

857

 

 

PosixFileAttributes, назначение

и методы,

863

 

 

 

Queue

 

 

 

 

 

 

методы,64б

 

 

 

 

 

назначение,

64б

 

 

RandomAccess, назначение

 

и реализация,

672

 

 

ReadaЬle, назначение

 

 

и методы,

629

 

 

 

ReadWritel,ock,

назначение

 

и реализация,

1099

 

 

Remote, назначение, 1168

 

RunnaЬle

 

 

 

 

 

613

метод run(),

определение,

Предметный указатель

1475

назначение,

307

применение, 308

реализация,310;613

ScheduledExecutorService,

назначение, 1089

SerializaЬle, назначение

и реализация, 843

Servlet, реализация

и методы,

1410

ServletConfig,

назначение

и методы,

1411

ServletContext, назначение

и методы,

1411

ServletRequest, назначение

и методы,

1412; 1414

ServletResponce, назначение

и методы,

1413

Set, назначение, 642; 643

SortedMap

 

 

методы,677

 

назначение,

676

SortedSet

 

 

методы,643

 

назначение,

643

Spliterator

 

 

методы, 667; 1149

назначение

 

и особенности, 667

подчиненные интерфейсы,

назначение, 670

применение, 668

StackWalker.StackFrame,

назначение, 626

Stream, назначение и методы,

1125;1152

 

 

SwingConstants, назначение

и константы, 1208

System.Logger, назначение, 599

TaЬleColumnModel,

назначение, 1236

TaЬleModel,

назначение, 1236

Textlistener,

назначение

и методы,

931

Thread.

 

 

UncaughtExceptionHandler,

реализация

и методы, 630

Toggle, назначение

и реализация, 1309; 1312

TreeNode, назначение

и методы,

1233

TreeSelectionlistener,

назначение, реализация

и методы,

1232

UnicastRemoteObject,

назначение, 1168

WindowConstants, назначение

и реализация, 1194

WindowFocusListener,

назначение

и методы, 931

Windowlistener, назначение

и методы,

931

вложенные,

применение, 263

исполнителей, назначение

и реализация, 1065

коллекций, разновидности

и назначение, 636

назначение,259

обобщенные, применение, 437

объявление,

260

отображений,

разновидности,672

приемников

событий,

разновидности,928

применение,

264

расширение,

270

реализация,261

Исключения

 

 

более точное повторное

rенерирование, 301

в операциях

ввода-вывода,

обработка, 391

встроенные,

293

вывод описания, 284

многократный перехват, 300

необрабатываемые, 281

непроверяемые, 293

обработка

вручную

в блоках

операторов try/

catch, 282

преимущества, 282

определение, 279

порядок

 

 

генерирования,280

обработки,279

при вводе-выводе,

обработка,804

применение, 301

проверяемые, 293

разнотипные, перехват, 284

составление

в цепочки

и обработка, 298

типы,280

 

 

Исходные файлы, именование

и расширение, 65

Итераторы

 

 

в потоках

данных

типы, 1147

 

назначение, 662

получение, 664

разделители

 

в потоках данных,

применение, 1149

назначение, 666

применение, 667

характеристики,

определение, 670

 

 

к

Каталоги

 

 

дерево,перечисление,885

назначение,

800

получение содержимого, 882

просмотр

содержимого, 800

создание,803

DateFormat

 

константы и методы, 1172

назначение,1172

DateTimeFormatter

назначение и

методы, 1178

применение,

1179

шаблоны

 

форматирования, 1180

DefaultМutaЫeTreeNode,

назначение, конструкторы

и методы, 1233

Dialog, назначение

и конструкторы, 1029

Dictionary

 

методы, 716

 

назначение, 716

DouЫe

 

методы и константы, 561

назначение

 

и конструкторы, 561

Effect, встроенные эффекты,

разновидности,1348

Enum

 

методы, 344; 626

назначение,344;626

EnumMap

 

конструкторы, 685

назначение,685

EnumSet

 

назначение,661

фабричные методы, 661

Error, назначение, 280

Event

 

методы, 1289

 

назначение

 

и подклассы, 1289

EventObject

 

методы, 915

 

назначение

 

и конструкторы, 914

EventSetDescriptor, назначение

и методы, 1398

Exception

 

конструкторы, 296

назначение, 280

Exchanger

 

назначение,1078

объявление и методы, 1078

применение,

1078

File

 

конструкторы, 797

методы, 798

 

назначение, 796

FileChannel, назначение

и методы, 855

FilelnputStream

конструкторы и методы, 389

назначение, 388

FilelnputStream, назначение

и конструкторы, 809

FileOutputStream

конструкторы и методы, 389

назначение,388

Предметный указатель

1477

FileOutputStream, назначение

и конструкторы, 811

 

FileReader, назначение

 

и конструкторы, 831

 

Files

 

 

методы, 858; 864

 

назначение,

858

 

FileWriter, назначение

 

и конструкторы, 832

 

FilterlnputStream, назначение

и конструкторы, 817

 

FilterOutputStream, назначение

и конструкторы, 817

 

Float

 

 

методы и константы, 561

 

назначение

 

 

и конструкторы, 560

 

FlowLayout

 

 

конструкторы

 

и константы, 1008

 

назначение,

1008

 

FocusEvent

 

919

конструкторы и методы,

назначение и константы,

919

Font

 

 

конструкторы, 971

 

методы, 969

969

 

назначение,

 

переменные, %9

 

FontМetrics

 

 

методы, 975

975

 

назначение,

 

Fork)oinPool

 

 

конструкторы, 1105

 

методы, 1105; 1120

 

назначение,

1104

 

Fork)oinTask, назначение

 

и методы, 1102; 1119

 

Formatter

 

 

закрытие объектов,

 

способы, 769

 

конструкторы, 755

 

методы, 755

754

 

назначение,

 

Frame

 

 

конструкторы, 952

 

методы,953

 

 

назначение,

952

 

FXCollections, назначение

 

и методы, 1326

 

GencricServlet, назначение

 

и методы, 1408; 1413

 

Glow

 

 

конструкторы

 

и методы,

1349

 

назначение,

1348

 

GraphicsContext, назначение

и методы, 1294

 

GraphicsEnvironment,

 

назначение

и методы, 970

Graphics, назначение

 

и методы, 954; 958; 1037

 

GregorianCalendar

 

методы, 742

 

назначение,742

поля и конструкторы, 742

применение, 742

GridBagConstraints

константы, 1019

назначение,1018

поля ограничений, 1018

статические

поля, 1019

GridBagLayout

конструкторы

и методы,

1018

назначение,1018

GridLayout, назначение

и конструкторы, 1013

HashMap

 

конструкторы, 681

назначение,681

применение, 681

HashSet

 

конструкторы, 656

назначение,656

применение, 657

HashtaЫe

 

конструкторы, 717

методы, 718

 

назначение,717

применение, 719

HttpServlet, назначение

и методы, 1421; 1422

HttpURLConnection

методы, 903

903

назначение,

применение, 903

ldentityHashМap,

назначение,685

lmage

 

конструкторы, 1302

назначение,1301

Image, назначение, 1036

lmageFilter, назначение

и подклассы, 1048

Imagelcon, назначение

и конструкторы, 1208

lmageYiew

 

конструкторы, 1302

назначение,

1301

Inet4Address и lnet6Address,

назначение,894

lnetAddress

 

методы экземпляра, 893

назначение,

891

фабричные

методы, 892

lnheritableThreadLocal,

назначение, 621

lnnerShadow,

назначение

и конструкторы, 1349

InputEvent

 

методы, 920

назначение

и константы,

920;1250

 

InputStreamReader,

назначение, 383

назначение, 733

 

применение, 735

 

OptioпalDouЬle,

 

Optioпallпt, Optioпa!Loпg,

назначение,736

 

OutputStream, назначение

и методы, 808

 

Package, назначение

и методы, 621

 

Paint, назначение

 

и подклассы, 12%

Рапе!, назначение, 952

Paths, назначение

 

и методы, 861

 

Patterп

 

 

назначение и методы, 1154

Phaser

 

 

методы, 1080

 

назначение,1080

 

применение, 1080

Pixe!Grabber

 

 

конструкторы и методы, 1045

назначение, 1045

 

Platform, назначение

и методы,

1365

 

РорuрМепu,назначение,1029

PriпtStream

 

 

конструкторы, 823

методы, 824

 

назначение,823

 

PriпtStream,

назначение

и методы,

387

 

PrintWriter

 

 

методы, 387; 840

 

назначение и конструкторы,

387;839

 

 

PriorityQueue

 

конструкторы, 659

назначение,659

 

применение, 660

 

Process, назначение

и методы,

584

 

ProcessBuilder

 

методы, 591

 

назначение

 

и конструкторы, 591

ProcessBuilder.Redirect,

назначение и константы, 593

Properties

 

 

конструкторы, 721

методы, 721; 724

 

назначение, 720

 

применение, 722

 

PropertyDescriptor

конструкторы, l<IOO

назначение и методы, 1398

PushbacklпputStream

конструкторы и

методы, 820

назначение, 820

 

применение, 820

 

PushbackReader

методы, 838

конструкторы и

назначение, 838

 

Предметный указатель

1479

RadioButtoп

 

 

конструкторы, 1312

назначение,

1312

RadioMeпultem, назначение,

конструкторы

и методы, 1370

Raпdom

 

 

конструкторы, 747

методы, 748

747

назначение,

RaпdomAccessFile

конструкторы, 828

методы, 829

 

назначение,

828

Reader, назначение

и методы, 829

RecursiveActioп

назначение

и

методы, 1103

применение,

1108

RecursiveTask

и методы, 1104

назначение

применение,

1114

l~eeпtraпtLock,

 

назначение, 1097

ReeпtraпtReadWriteLock,

назначение,1099

ResourceBuпdle

методы, 783

 

назначение,

782

подклассы, назначение, 785

RGBlmageFilter,

применение, 1050

Rotate, назначение,

конструкторы

и методы, 1350

Ruпtime

 

процессов, 589

выполнение

назначение

и методы, 586

управление

памятью, 588

RuпtimeException,

назначение,

280

RuпtimePermissioп,

назначение, 624

Ruпtime.Versioп, назначение

и методы, 590

Scale, назначение,

конструкторы

и методы, 1350

Sсаппеr

 

 

конструкторы, 770

методы, 772;

781

назначение,770

применение,

772; 775

Sсепе

 

 

конструкторы, 1284

назначение, 1279

Scrollbar

 

 

методы, 999

 

назначение

 

 

и конструкторы, 999

ScrollPaпe

 

 

конструкторы

и методы,

1338

назначение,1338

SecurityMaпager,

назначение,624

Semaphore

 

конструкторы

и методы,

1067

назначение,

1067

SequeпcelпputStream,

назначение

 

и конструкторы, 821

ServerSocket

 

методы, 906

 

назначение

 

и конструкторы, 905

ServiceLoader,

назначение, 511

ServletlпputStream,

назначение,

конструкторы

и методы, 1414

ServletOutputStream,

назначение,

конструкторы

и методы, 1414

SimpleBeaпlпfo,

назначение,1394

SimpledateFormat

применение, 1175

SimpleDateFormat

конструкторы, 1174

назначение,

1174

шаблоны

 

форматирования, 1174

SimpleTimeZoпe, назначение

и конструкторы, 745

SiпgleSelectioпModel,

назначение

и методы, 1221

Socket

 

методы,895

 

назначение

 

и конструкторы, 894

применение, 895

SocketAddress, назначение

и реализация, 907

Stack

 

методы, 714

714

назначение,

применение, 714

StackTraceElemeпt

методы,625

 

назначение

 

и конструкторы, 624

StackWalker, назначение

и методы, 626

Stage

 

главные подмостки, 1279

назначение,1279

StrictМath, назначение

и методы, 612

Striпg

 

конструкторы, 530

методы, 211; 535; 549

назначение,210;529

StriпgBuffer

 

конструкторы, 532; 551

методы, 551; 557

назначение,

550

для модулей

 

 

 

ограниченные,

 

определение,494

 

перечень,493

 

 

для обрабmки

 

 

исключений, 279

 

для помержки

служб,

 

назначение,

512

 

Коллекции

 

 

 

алгоритмы

 

 

 

применение,

701

 

генеририруемые

 

исключения,

637

 

естественное

 

 

 

упорядочение,686

 

изменяемые и

неизменяемые,

определение,

636

 

итераторы, назначение, 635

 

каркас CoUectioпs Framework,

назначение,

634

 

параллельные

 

 

 

классы, 1066; 1095

 

назначение, 10%

 

перебор

стиле for

 

в цикле for в

 

each,665

 

 

 

итераторами, 664

 

произвольный

доступ

 

к элементам,

672

 

синхронизированные,

 

назначение,

700

 

сохранение объектов разных

классов,670

 

 

 

Комментарии

 

 

 

документирующие

 

назначение,1431

 

обозначение,1431

 

общая форма, 1437

 

определение,

76

 

применение,

1438

 

мноrострочные, 66

 

назначение,66

 

 

однострочные, 67

 

Компактные профили

 

назначение, 411

 

преимущества, 412

 

Компараторы

 

 

 

назначение,686

 

с естественным

 

упорядочением,687

 

с обратным

 

 

 

упорядочением,687

689

специальные,

применение,

Комплекты ресурсов

 

назначение,782

 

обозначение, 782

 

по умолчанию,

 

 

применение,

783

 

применение, 787

 

Компоненты

 

 

 

Java Beans

 

 

 

архитектура,1389

 

Предметный указатель

1481

индексированные свойства,

назначение,1392

 

методы и шаблоны

 

проектирования,1393

назначение,1389

 

настройщики,

 

применение, 1395

 

обработка событий, 1392

ограниченные свойства,

назначение, 1394

 

преимущества, 1390

 

привязанные свойства,

 

назначение,1394

 

применение, пример, 1398

простые свойства,

 

назначение,1391

1390

самоанализ, механизм,

свойства, установка

 

и получение, 1391

 

сохраняемость,1394

 

Swiпg

1264

действия, применение,

деревья типа )Tree, создание

и применение, 1232

 

значки типа

 

lmagelcon, создание

 

и применение, 1208

 

классы, 1207

 

кнопки-переключатели типа

JRadioButton, создание

и применение, 1219

 

комбинированные списки

типа JComboBox, создание

и применение, 1229

 

метки типа JLabel, создание

и применение, 1207

 

панели с вкладками типа

JTabbedPane, создание

и применение, 1221

 

переключатели типа

 

JToggleButtoп, создание

и применение, 1215

 

построение на основе

 

AWT, 1189

 

прокручиваемые панели

типа JScroUPane, создание

и применение, 1224

 

списки типа JList, создание

и применение, 1226

 

таблицы типа

 

JТаЫе, создание

 

и применение, 1236

 

текстовые поля типа

 

JTextField, создание

 

и применение, 1210

 

флажки типа

 

JCheckBox, создание

 

и применение, 1217

 

экранные кнопки типа

 

JButton, создание

 

и применение, 1212

 

визуальные,

 

составляющие, 1188

 

легковесные, 1033

 

определение, 1187

 

равноправные,

 

определение,1186

 

тяжеловесные, 1033

 

определение,1186

 

Константы

 

 

перечислимого типа, 338

 

самmипизированные, 338

 

Конструкторы

 

 

вызов по ссылке this(), 409

177

инициализация объектов,

назначение,168

436

обобщенные, применение,

параметризированные,

 

применение, 179

 

перегрузка, 188

 

порядок вызова, 235

 

по умолчанию,

 

применение, 168

 

суперклассов, вызов, 227

 

Контейнеры

 

 

Swing

 

 

панели,разновидности,1190

разновидности,1190

 

сервлетов Tomcat

 

применение, 1407

 

состав,1406

 

установка,1406

 

Крутлые скобки,

 

применение, 130

 

 

л

 

Литералы

 

 

двоичные, применение, 87

 

классов,361

 

 

логические,

применение, 89

назначение,

76

89

символьные, применение,

с плавающей точкой, формы

записи,88

 

 

строковые, применение, 90; 533

целочисленные,

 

применение, 87

 

Лямбда-выражения

 

блочные, определение, 466

внедрение,53

 

захват переменных, 475

 

исключения,

 

генерирование, 473

 

контекст,разновидности,462

лямбда-операция,

 

назначение, 460

 

назначение,53

 

одиночные,

определение, 466

определение, 460

 

основные принципы действия,

примеры,

463

 

передача в качестве

 

аргументов, 470

459

преимущества внедрения,

тела,разновидности,466

 

Предметный

указатель

1483

графы, назначение, 519

дескрипторы, определение, 494

именование, порядок, 495 компиляция в многомодульном режиме,505 назначение,54;493 объявление общая форма, 494 порядок,493 открытые, назначение, 521

перспективы на будущее, 525 платформенные, описание, 502 помержка служб, 512 лрименение,особенности,504 пути,назначение,499 уровни,назначение,524

экспорт пакетов,504 уточненный, особенности, 505

н

Наследование интерфейсов, механизм, 270

многоуровневые иерархии,

построение, 232 множественное, помержка, 275 назначение, 221 принцип,применение,221 суперклассы и подклассы, 221

о

Области видимости

вложенные, 93 назначение,92 разновидности,92 Обобщения

аргументы типа, назначение, 417

внедрение, преимущества, 413

выведение типов, 451

главное преимущество, 421

метасимвольные аргументы

ограниченные, применение, 430

применение, 427

обеспечение типовой безопасности,414;419 определение, 414 ошибки неоднозначности, 454

параметры типа,

назначение, 416

присущие ограничения, 455;458 реализация в Java, особенности, 452 стираниетипов,механизм,452 Оболочки типов

классы, 347 назначение, 347

примитивных, классы, 560

 

числовых, классы, 349

 

Объекты

 

 

 

 

возврат,195

 

 

 

 

как экземпляры класса, 163

 

клонирование,600

 

 

объявление,167

 

 

передача

 

 

 

 

в качестве

параметров, 191

сериализация

 

 

 

и десериализация, 843

 

синхронизации,

 

 

применение, 1066

 

 

Окна

 

 

 

 

в виде фреймов, 952

 

верхнего уровня, 952

 

иерархия классов, 950

 

обрамляющие

953

 

задание размеров,

 

закрытие,

953

 

 

порядок создания, 953

953

сокрытие и отображение,

установка

заголовка, 953

 

просмотра

 

 

 

 

задание размеров,

1339

 

назначение,1339

 

 

определение,1224

 

Оперативные

клавиши,

 

назначение,

1249; 1366

 

Операторы

 

 

 

 

catch, применение, 284

 

exports

 

 

 

 

предложение to,

 

 

назначение, 504

 

 

применение, 501

 

 

fiпally, назначение, 292

 

import static

 

408

 

основные формы,

 

применение, 406

257

 

import, назначение,

 

opens, применение, 521

 

расkаgе,назначение,250

 

pгovides, применение, 512

521

гequires static, применение,

requiгes tгansitive,

 

 

применение, 507

 

 

гequires, применение, 501

 

synchronized,

применение, 322

throws, назначение,

290

 

throw, применение,

289

 

tгу

 

 

 

 

вложенные,

применение, 286

с ресурсами, применение,

 

395;398;805

 

 

uses, применение, 512

 

ветвления, switch

 

 

вложенные,

описание, 139

назначение,

135

 

 

особенности, 139

 

 

применение, 135

 

 

перехода

 

 

 

 

Ьгеаk

 

 

 

 

применение, 155

 

с меткой, применение, 158

continue, применение, 160

гeturn, применение, 161

 

пустые, назначение, 141

 

ромбовидные, назначение, 451

управляющие

 

 

категории, 131

 

назначение,131

 

условные, if

 

 

вложенные, 133

 

конструкция if-else-if,

 

применение, 134

 

назначение, 131

 

применение, 72

 

простейшая форма, 71

 

цикла

 

 

do-while, применение, 142

for

154

 

вложенные,

147

запятые, применение,

простейшая форма, 73

 

разновидности, 147

145

традиционная форма,

форма в стиле fог each, 149

while, применение, 140

 

Операции

 

 

instanceof, назначение, 400

new, применение, 168

 

арифметические

 

деления по модулю, 111

 

инкремента

 

 

и декремента, 112

 

инкремента и

декремента,

назначение,74

 

основные, 110

 

применение, 109

 

составные

 

 

с присваиванием, 111

 

логические

 

 

применение, 125

 

разновидности,125

 

укороченные,

 

 

применение, 126

 

отношения

 

 

применение, 124

 

разновидности,124

 

поразрядные

 

 

логические,

 

 

разновидности,116

 

применение, 114

 

составные,

 

 

с присваиванием, 123

 

потоковые

 

 

без сохранения

 

состояния,

1127

 

изменяемого

сведения, 1147

накопления,

 

 

ограничения,1133

 

оконечные

 

 

и промежуточные,

 

отличие, 1126

 

особого сведения, 1132

 

с сохранением

 

состояния,

1127

 

Предметный

указатель

1487

изменения в группе

 

кнопок-переключателей,

обработка, 1316

 

 

источники

913

 

 

определение,

 

 

регистрация

 

 

 

приемников, 913

 

настройки,разновидности,916

обработка, способы, 912

оконные, разновидности, 926

определение, 912

 

 

от выбираемых элементов

ГПИ, разновидности,

921

от клавиатуры

 

 

 

обработка, 937

 

 

разновидности,922

 

от колесика мыши,

924

 

от мыши

 

 

 

обработка, 933

 

 

разновидности,923

 

от полос прокрутки,

 

обработка, 1000

 

997

от списков, обработка,

от флажков, обработка, 989

от экранных кнопок,

 

обработка, 984

 

 

приемники

 

 

 

определение,

914

 

 

регистрация

и снятие

с регистрации,

913

 

строка с командой

действия

назначение, 984

 

 

получение, 1212

 

 

текстовые, разновидности, 925

ТИПЫ, 911

 

 

 

фокуса ввода,

 

 

 

разновидности,919

 

целевая рассылка, 913

 

Сокеты

 

 

 

определение, 889

 

 

по протоколу TCP/IP

 

клиентские, 894

 

 

серверные, 905

 

 

связь по сетевым

 

 

протоколам, 889

 

Состояние гонок

 

 

возникновение,321

 

исключение, 322

 

 

Спецификаторы

 

 

 

минимальной

ширины поля,

применение, 762

 

преобразования формата,

обозначение, 756

 

точности, применение, 763

формата

 

1180

 

буквы шаблона,

 

определение, 756

 

прописные формы,

 

применение, 767

 

разновидности, 757

 

Ссылки

 

 

 

на конструкторы

 

 

применение, 485

 

формы создания, 485; 489

на методы

 

 

 

 

назначение, 476

 

 

обобщенные,

482

 

применение,

 

применение

 

 

 

в коллекциях, 483

 

статические,

476

 

применение,

 

экземпляра,

 

 

 

применение,

478

 

на объекты

 

 

 

 

присваивание,169

 

Статический

импорт

 

назначение, 406

 

 

 

особенности, 409

 

 

применение, 407

 

 

Стек

 

 

 

 

ввод и удаление

 

 

 

элементов, 714

 

 

принцип действия, 714

 

Стековый фрейм,

 

 

 

назначение, 624

 

 

 

Стирание типов, принцип

 

действия,452

 

 

 

 

т

 

 

 

Текст

 

 

 

 

воспроизведение на холсте,

1296

 

 

 

 

выводимый в окне,

 

форматирование, 975

 

многострочный

 

 

 

отображение, 976

 

Типы данных

 

 

 

базовые, назначение, 440

 

обобщенные, различение

 

по аргументам, 419

 

ограниченные,

 

 

 

назначение, 424

 

 

примитивные

 

 

 

логические значения, 85

 

обработка в потоковых

 

интерфейсах,

1127

 

применение, 80

79

 

разновидности,

 

символы,84

 

 

 

целые числа, 80

 

 

числа с плавающей

 

точкой, 82

 

 

 

строковые, назначение, 107

Традиционное управление

399

ресурсами, особенности,

Трассировка стека,

 

 

назначение,282

 

 

 

Удаленный вызов

методов

 

заглушки

 

 

 

 

назначение, 1170

 

создание, 1170

 

 

запуск

 

 

 

 

клиента,

1171

 

 

 

реестра,

1170

 

 

 

сервера,1171

 

 

 

механизм,

1168

 

 

 

 

у

 

Универсальное

 

 

скоординированное время,

определение,

743

Упаковка,назначение,350

Управляющие

 

 

последовательности

символов,описание,90

Утверждения

 

 

включение и

отключение

режима проверки, 406

назначение, 403

применение,

403

Утилиты

применение, 1464

appletviewer,

jar

 

 

параметры, описание, 1442

применение,

523

jarsigпer, применение, 1442

javadoc

 

 

дескрипторы,

разновидности,1432

назначение,1431

применение,

1437

javafxpackager,

1285

применение,

javaws, применение, 1450

jliпk

 

 

назначение, 522

jliпk, применение, 524

jmod, применение, 524

JShell

 

 

временные переменные,

применение, 1459

запуск на выполнение, 1451

импорт пакетов, 1459

интерфейсы,

 

реализация, 1457

классы, создание, 1456

команды, описание,

1454; 1460

 

методы, выполнение, 1455

принцип действия, 1451

программная среда, 1452

сохранение состояния, 1453

фрагменты,

 

определение, 1451

keytool, применение,

1443; 1447

 

 

rmiregistry, назначение, 1170

 

ф

Файлы

 

 

атрибуты

 

 

доступ, способы, 863

назначение, 862

доступ,назначение,800

закрытие

 

 

автоматическое, 3%

традиционным

способом,

390

запись данных через канал

новые способы, 871

Соседние файлы в папке Лабораторные работы (Объектно-ориентированное программирование (ООП))