ГЛАВА 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 |
||
