Оглавление
Предисловие
Часть 1. Язык Java
Глава 2. Краткий обзор Java
Глава 3. Типы данных, переменные и массивы
Глава 4 . Операции
Глава 5. Управляющие операторы
Глава 6. Введение в классы
Глава 7. Подробное рассмотрение классов и методов
Глава 8. Наследование
Глава 9. Пакеты и интерфейсы
Глава 10. Обработка исключений
Глава 11. Многопоточное программирование
Глава 13. Ввод-вывод, аплеты в прочие вопросы
Глава 14. Обобщения
Глава 15. Лямбда·выражения
Часть 2. Библиотека Java
Глава 17. Пакет java. lang
Глава 18. Пакет java. util, часть 1. Collections Framework
Глава 19. Пакет java. util, часть 2. Прочие служебные классы
Глава 20. Пакет java. io для ввода-вывода
Глава 21. Система ввода·вывода NIO
Глава 22. Работа в сети
Глава 23. Класс Applet
Глава 24. Обработка событий
Глава 25. Введение в библиотеку АWТ: работа с окнами, графикой и текстом
Глава 26. Применение элементов управления, диспетчеров компоновки и меню из библиотеки АWТ
Глава 27. Изображения
Глава 28. Утилиты параллелизма
Глава 29. Потоковый API
Глава 30. Регулярные выражения и другие пакеты
Часть 3. Введение в программирование ГПИ средствами Swing
Глава 32. Исследование библиотеки Swing
Глава 33. Введение в меню Swing
Часть 4. Введение в программирование ГПИ средствами JavaFX
Глава 35. Элементы управления JаvаFХ
Глава 36. Введение в меню JavaFX
Часть 5. Применение Java
Глава 38. Введение в сервлеты
Приложение
Предметный указатель
Text
                    Java8
Полностью обновлено с учетом
версии Java SE 8 (JDK 8)
Полное руководство
Девятое издание
Исчерпывающее и незаменимое учебное пособие по написанию,
компилированию и выполнению современных программ на Java
Герберт Шилдт


ORACLE OraekPress полное Java 8 руководство � девятое издание
ORACLE The Complete Reference Oracle Press"" Java Ninth Edition Herbert Schildt New York • Chicago • San Francisco • Athens • London • Madrid Mexico City • Milan • New Delhi • Singapore • Sydney • Toronto
ORACLE Oracle Pres s "' Полное Java 8 руководство девятое издание Герберт Шилдт • Издательский дом �вильямс" Москва •Санкт-Петербург• Киев 2015
ББК 32.973.26 -0 18.2 .75 Ш57 УДК 681 .3.07 Издател ьский дом "Вильяме" Зав. редакцией С.Н . Тfrигуб Перевод с английског о и редакция И.В. Берштейна По общим вопросам обращайте сь в И здател ьский дом " Вил ьяме" п о адресу: info@williamspuЫishing.com, http://ww w .williamspublishing.com Шилдт, Ге рберт. Ш57 Java 8. Полное руководство; 9-е изд.: Пер. с англ. - М. : ООО "И.Д. Вильяме", 2015. - 1376 с. : ил. - Парал. тит. англ. ISBN 978-5 -8459-1918-2 (рус.) ББК 32.973.26-018.2 .75 Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механиче­ ские, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства McG1·aw-Hill Education. Authorized translatioп from the English language edition puЫished Ьу McGraw-Hill Education, Copyright © 2014. Al l rights reseived. Except as peпnitted under the Copyiight Act of 1976, по part of this puЫication тау Ье reproduced or distributed in any fom1 or Ьу any means, or stored in а database or 1-etrieval system, without the p1ior written peпnission of Publisher, with the exception that the program listings may Ье entered, stoI"ed, and executed in а computer system, but they тау not Ье I"eproduced for publication. 01-acle andjava are registered trademarks ofOracle Corporation and/or its affiliates. Russian language edition puЫished Ьу Williams PuЫishing House according to the Agreement with R&I Enterprises Iпternationa\, Copyright © 2015 На учно-популярное издание Герберт Шилдт Java 8. Полное руководство 9-еиздание Л итературный редактор Ве рстка Худ ожествен ный редактор Корректор И.А . Попова О.В. Мишутина Е.П. Дынник Л.А . Гордиенко Подписано в печать 14.01.2015. Формат 70xl00/ 16 Гарнитура 1imes. Усл. печ. л. 86 ,0 . Уч. - изд. л. 79,2 Тираж 1000 экз. Заказ No 267 Оrпечатано способом ролевой струйной печати в ОАО •Первая Образцовая типография• Филиал •Чеховский Печатный Двор• 142300, Московская область, r. Чехов, ул. Полиграфистов, д.1 ООО "И . Д. Вильяме", 127055, г. Москва, ул. Лесная, д . 43 , стр. 1 ISBN 978-5-8459-1918-2 (рус.) ISBN 978-0 -07-180855-2 (англ.) ©Издательский дом "Вильяме" , 2015 © McGraw-Hill Education, 2014
Оглавление Предисловие Часть 1. Язык Java Глава 1. История и развитие языкаJаvа Глава 2. Краткий обзорJava Глава 3. Типы данных, переменные и массивы Глава 4 . Операции Глава 5. Управляющие операторы Глава 6. Введение в классы Глава 7. Подробное рассмотрение классов и методов Глава 8. Наследование Глава 9. Пакеты и интерфейсы Глава 10. Обработка исключений Глава 11. Многопоточное программирование Глава 12. Перечисления, автоупаковка и аннотации (метаданные) Глава 13. Ввод-вывод, аплеты в прочие вопросы Глава 14. Обобщения Глава 15. Лямбда·выражения Часть 11. Библиотека Java Глава 16. Обработка символьных строк Глава 17. Пакет java. lang Глава 18. Пакет java. uti l, часть 1. Collections Framework Глава 19. Пакет java. util, часть 11. Прочие служебные классы Глава 20. Пакет java. io для ввода-вывода Глава 21. Система ввода·вывода NIO Глава 22. Работа в сети Глава 23. Класс Applet Глава 24. Обработка событий Глава 25. Введение в библиотеку АWТ: работа с окнами, графикой и текстом Глава 26. Применение элементов управления, диспетчеров компоновки и меню из библиотеки АWТ Глава 27. Изображения Глава 28. Утилиты парал л елизма Глава 29. Потоковый API Глава 30. Регулярные выражения и другие пакеты Часть 111. Введение в программирование ГПИ средствами Swing Глава 31. Введение в библиотеку Swing Глава 32. Исследование библиотеки Swing Глава 33. Введение в меню Swing Часть IV. Введение в программирование ГПИ средствами JavaFX Глава 34. Введение вJavaFX Глава 35. Элементы управленияJаvаFХ Тhава 36. Введение в менюJavaFX Часть V. Применение Java Глава 37. КомпонентыJаvа Beans Глава 38. Введение в сервлеты Приложение Применение документирующих комментариев вJava Предметный указатель 28 31 33 53 75 103 125 155 177 209 235 263 285 317 355 395 437 467 469 497 563 651 717 769 811 833 855 885 923 975 1005 1061 1089 1119 1121 1143 1175 1209 1211 1233 1281 1309 1311 1323 1347 1347 1355
Содержание Предисловие Часть 1. Язык Java Глава 1. История и развитие языка J ava Прои(:хождение J ava 3арож.дение современного программиро ван ия: я:iык С Следующий этап: язык С++ Предносылки к созданию . Jаvа Со:щание языкаJava Свя:iь с языком С# Каким обра:юм языкjаvа изменил И11тt�р11ст Лнлеты нaJava Ьеао11ас нопъ Пе1>е11<1с имость Чудо J<t\•a: байт-код Ссрвлеты: сер верные програ ммы нaJava Отл ичительные особенности Java П)ЮП'О '\-d ( >бъсктная ориентиро ваннопъ 1 lадсж ность М 110\'О\ IОТОЧНО('ТJ, Архитектурная 11ейтра.11ь ность Ин тсрпретируемость и высокая прои:шодителыюсть Распрсi�t·л снность Ли11ам ичног1ъ Эволюция языкаJаvа Верс ия Ja\'a SE 8 Ку;шгура нововведений Глава 2. Краткий обзорjаvа Объектно-ориентирован ное 11рограмми1><1ван ис }1,ве методики Лбстраю�ия 'I)ш прющипа ООП 28 31 33 ;�3 34 35 37 37 39 40 40 41 41 41 43 43 44 44 44 45 45 46 46 46 46 50 51 53 53 5�� 54 54
С одержание 7 Первый пример простой программы 60 Ввод кода программы 61 Компиляция программы 61 Подробный анализ первого примера программы 62 Второй пример короткой программы 65 Два управляющих оператора 66 Условный оператор i f 67 Оператор цикла for 68 Использование блоков кода 69 Вопросы лексики 70 Пробелы 71 Идентификаторы 71 Литералы 71 Комментарии 72 Разделители 72 Ключевые словаjаvа 72 Библиотеки классов Java 73 Глава 3. Типы данных, переменные и массивы 75 Jаvа-строго ти пизированный язык 75 Примити вные типы 75 Целые числа 76 ТипЬуtе 77 Тип short 77 Тип int 77 Тип long 78 Числа с плавающей точкой 78 Тип float 79 ТипdоuЫе 79 Символы 80 Логические значения 81 Подробнее о литералах 82 Целочисленные литералы 82 Литералы с плавающей точкой 84 Логические литералы 85 Символьные лите ралы 85 Строковые лите рал ы 86 Переменные 86 Объявление переменной 86 Динамическая инициализация 87 Область и срок действия переменных 87 Преобразование и приведение типов 90 Автоматическое преобразование типов в Java 90 Приведение несовместимых типов 91 Автоматическое продвижение типов в выражениях 92 Правила продвижения ти пов 93 Массивы 94 Одномерные массивы 94 Многомерные массивы 97 Альтернативный синтакс ис объявления массивов 1О1 Введение в символьные строки 1О1 Замечание по поводу указателей для программирующих на С/С++ 102
8 Содержание Глава 4 . Операции Арифметические операции Основные арифметические операции Операция деления по модулю Составные арифметические операции с присваиванием Операции инкремента и декремента Поразрядные операции Поразрядные логические операции Сдвиг влево Сдвиг вправо Беззнаковый сдвиг вправо Поразрядные составные операции с присваиванием Операции отношения Логические операции Укороченные логические операции Операция присваивания Те рнарная операция ? Предшествование операций Применение круглых скобок Глава 5. Управляющие операторы Операторы выбора Условный оператор i f Оператор switch Операторы цикла Цикл while Цикл do-while Цикл for Вложенные циклы Операторы перехода Применение оператора break Применение оператора continue Оператор return Глава 6. Введение в классы Основы классов Общая форма класса Простой класс Объявление объектов Подробное рассмотрение оператора new Присваивание переменным ссылок на объекты Введение в методы Ввод метода в класс Вох Возврат значений Ввод метода, принимающего параметры Конструкторы Параметризированные конструкторы Ключевое слово this Сокрытие переменной экземпляра Сборка "мусора" Метод finalize () Класс Stack 103 103 104 105 105 106 108 109 111 113 114 116 117 118 120 120 121 122 123 125 125 125 128 133 133 135 138 147 147 148 151 153 155 155 155 156 159 160 161 162 163 164 166 168 170 171 172 172 173 174
Содержание 9 Глава 7. Подробное рассмотрение классов и методов 177 Перегрузка методов Перегрузка конструкторов Применение объектов в качестве параметров Подробное рассмотрение особенностей передачи аргументов Возврат объектов Рекурсия Введение в управление доступом Ключевое слово static Ключевое слово final Еще раз о массивах Вложенные и внутренние классы Краткий обзор класса String Применение аргументов ко мандной строки Аргументы переменной длины Перегрузка методов с аргументами переменной дл ины Аргументы переменной дл ины и неоднозначность 177 180 182 184 186 187 189 193 194 195 197 200 202 203 206 207 Глава 8. Наследование 209 Основы наследования 209 Доступ к чл енам класса и наследование 211 Более практический пример 212 Переменная суперкласса может ссылаться на объект подкласса 213 Ключевое слово super 214 Вызов конструкторов суперкласса с помощью ключевого слова super 215 Другое применение ключевого слова super 218 Создание многоуровневой иерархии 219 Порядок вызова конструкторов 222 Переопределение методов 223 Динамическая диспетчеризация методов 225 Назначение переопределенных методов 226 Применение переопределения методо в 227 Применение абстрактных классов 228 Кл ючевое слово final в сочетании с наследованием 231 Предотвращение переопределения с помощью ключевого слова final 231 Предотвращения наследования с помощью ключевого слова final 232 Класс Ob j ect 233 Глава 9. Пакеты и интерфейсы 235 Пакеты 235 Определение пакета 236 Поиск пакетов и переменная окружения CLASSPATH 236 Краткий пример пакета 237 Защита доступа 238 Пример защиты доступа 239 Импорт пакетов 242 Инте рфейсы 244
1О Содержание Объя вление интерфейса 245 Реализация интерфейсов 246 Вложе нные интерфейсы 249 Применение интерфейсов 250 Переменные в интерфейсах 253 Расширение инте рфейсов 255 Методы по умолчанию 255 Основы применения методов по умолчанию 257 Более практический пример 258 Вопросы множественного наследования 259 Применение статических методов в инте рфейсе 260 Заключительные соображения по поводу пакетов и интерфейсов 261 Глава 10. Обработка ис ключений 263 Основы обработки исключений 263 Ти пы исключений 264 Необрабатываемые исключения 265 Использование блоков операторов try и catch 266 Вывод описания исключения 268 Применение нескольких операторов catch 268 Вложенные операторы try 270 Оператор throw 272 Оператор throws 273 Оператор finally 275 Встроенные в Java исключения 276 Создание собственных подклассов исключений 278 Цепочки исключений 280 Недавно внедренные средства для обработки исключений 282 Применение исключений 284 Глава 11. Мн огопоточное программирование 285 Модель потоков испол нения вjava 286 Приоритеты потоков 287 Синхронизация 288 Обмен сообщениями 289 Класс Thread и инте рфейс RunnaЫe 289 Главный поток исполнения 290 Создание потока исполнения 291 Реализация интерфейса RunnaЫe 292 Расширение класса Thread 294 Выбор способа создания потоков исполнения 295 Создание многих потоков исполнения 295 Применение методов isAlive () и join () 297 Приоритеты потоков исполнения 299 Синхронизация 300 Применение синхронизированных методов 301 Оператор synchronized 303 Взаимодействие потоков испол нения 304 Взаимная бло кировка 309
С одержание 11 Приостановка, возобновление и остановка потоков исполнения 311 Получение состояния потока исполнения 313 Применение многопоточности 315 Глава 12. ПеречисленИJI, автоупаковка и аннотации (метаданные) 317 Перечисления 317 Основные положения о перечислениях 317 Методы values ()и valueOf () 319 Перечисления вJava относятся к типам классов 321 Перечисления наследуются от класса Enum 323 Еще од ин пример перечисления 325 Оболочки типов 326 Класс Character 327 Класс Boolean 327 Оболочки числовых типов 327 Автоупаковка 328 Автоупаковка и методы 329 Автоупаковка и автораспаковка в выражениях 330 Автоупаковка и распаковка значений из классов Boolean и Character 332 Автоупаковка и автораспаковка помогают предотвратить ошибки 333 Предупреждение 333 Аннотации (метаданные) 334 Основы аннотирования программ 334 Правила уд ержания аннотаций 335 Получение аннотаций во время выполнения с помощью рефлекс ии 336 Второй пример применения рефлексии 338 Получение всех аннотаций 339 Инте рфейс AnnotatedElement 341 Использование значений по умолчанию 341 Аннотации-маркеры 343 Одночленные аннотации 343 Встроенные аннотации 345 Ти повые аннотации 347 Повторяющиеся аннотации 352 Некоторые ограничения на аннотации 353 Глава 13. Ввод-вывод, аплеты и прочие вопросы 355 Основы ввода-вывода 355 Потоки ввода-вывода 356 Потоки ввода-вывода байтов и символов 356 Предоп ределенные потоки ввода-вывода 359 Чтение данных, вводимых с консоли 359 Чтение символов 360 Чтение символьных строк 361 Запись данных, выводимых на консоль 362 Класс PrintWriter 363 Чтение и запись данных в файлы 364 Автоматическое закрытие файла 370 Основы создания аплетов 374
12 Содержание Модификаторы доступа transient и volatile 377 Применение оператора instanceof 378 Модификатор доступа strictfp 380 Платформенно-ориентирован ные методы 381 Трудности , связанные с платформенно-ориентированными методами 384 Применение ключевого слова assert 385 Параметры включения и отключения режима проверки утверждений 388 Статический импорт 388 Вызов перегружаемых конструкторов по ссылке this () 391 Компактные профилиjаvа API 393 Глава 14. Обобщения 395 Что такое обобщения 396 Простой пример обобщения 396 Обобщения действуют только со ссылочными типами 400 Обобщенные типы различаются по аргументам типа 400 Каким образом обобщения повышают типовую безопасность 401 Обобщенный класс с двумя параметрами типа 403 Общая форма обобщенного класса 404 Ограниченные типы 405 Применение метасимвольных аргументов 407 Огран иченные метасимвольные аргументы 410 Создание обобщенного метода 414 Обобщенные конструкторы 417 Обобщенные интерфейсы 417 Базовые типы и унаследованный код 420 Иерархии обобщенных классов 422 Применение обобщенного суперкласса 422 Обобщенный подкласс 424 Сравнение ти пов в обобщенной иерархии во время выполнения 425 Приведение типов 428 Переопределение методов в обобщенном классе 428 Выведение типов и обобщения 429 Стирание 431 Мостовые методы 431 Ошибки неоднозначности 433 Некоторые ограничения, присущие обобщениям 434 Получить экземпляр по параметру типа нельзя 434 Огран ичения на статические члены 435 Ограничения на обобщенные массивы 435 Огран ичения на обобщенные исключения 436 Глава 15. Лямбда-выражения 437 Введение в лямбда-выражения 438 Основные положения о лямбда-выражениях 438 Функциональные инте рфейсы 439 Некоторые примеры лямбда-выражений 440 Блочные лямбда-выражения 444 Обобщенные функциональные интерфейсы 446 Передача лямбда-выражений в качестве аргументов 447 Лямбда-выражения и исключения 450
Содержание 1З Лямбда-выражения и захват переменных 451 Ссылки на методы 453 Ссылки на статические методы 453 Ссылки на методы экземпляра 454 Ссылки на обобщенные методы 458 Ссылки на конструкторы 460 Предопределенные функциональные инте рфейсы 465 Часть 11. Библиотека Java 467 Глава 16. Обраб отка символьных строк 469 Конструкторы символьных строк 470 Дл ина символьной строки 472 Специальные строковые операции 472 Строко вые литералы 472 Сцепление строк 473 Сцепление символьных строк с другими типами данных 473 Преобразование символьных строк и метод toString () 474 Извлечение символов 475 Метод charAt () 475 Метод getChars () 476 Метод getBytes () 476 Метод toCharArray () 477 Сравнение символьных строк 477 Методы equals () и equalsignoreCase () 477 Метод regionMatches () 478 Методы startsWith () и endsWith () 478 Метод equals () в сравнении с операцией== 479 Метод compareTo () 480 Поиск в символьных строках 481 Видоизменение символьных строк 482 Метод substring () 483 Метод concat ( ) 484 Метод replace () 484 Метод trim () 484 Преобразование дан ных методом valueOf () 485 Изменение регистра символов в строке 486 Соеди нение символ ьных строк 487 Допол н ительные методы из класса String 487 Класс StringBuffer 489 Конструкторы класса StringBuffer 489 Методы length () и capacity () 490 Метод ensureCapacity () 490 Метод setLength () 491 Методы charAt () и setCharAt () 491 Метод getChars () 492 Метод append () 492 Метод insert () 493 Метод reverse () 493 Методы delete ( ) и deleteCharAt () 494
1' Содержание Метод replace ( ) Метод substring () Дополнительные методы из класса StringBuffer Класс StringBuilder · · Тhава 17. Пакет java. lang Оболочки прииити�Н1П!11mо'в Класс NumЬer Классы DouЫe и Float Методы isinfinite () � ..�::?�а�(} Классы Byte, Short, Integtэr И Long Класс Character До полнения класса Character для подцержки кодовых точек в Юиикоде Класс Boolean КлaccVoid Класс Prooeee Класс Runtime Управление памятью Выполнение других программ Класс ProcessBuilder Класс System Измерение времени выполнения программы методом currentTimeMills () Применение метода arraycopy () Свойства окружения Класс Obj ect Применение метода clcme ( ) и интерфейса CloneaЫe Класс Class Класс ClassLoader КлассМаth Тригонометрические функции Экс поненциальные функции Функции округления Прочие методы из класса Маth Класс StrictMath Класс Compiler Классы Thread, ThreadGroup � и,нтерфейс RunnaЫe Интерфейс RunnaЫe Класс Thread Класс ThreadGroup Классы ThreadLocal и InheritaЫeThreadLocal Класс Package Класс RuntimePermission Класс ThrowaЫe Класс SecurityManager Класс StackTraceElement Класс Enum Класс ClassValue Интea:йcCharSequence Инте йс ComparaЫe Инте йс AppendaЬle 494 495 495 496 497 498 49� 498 503 503 514 517 519 520 520 521 523 524 525 528 530 531 532 532 533 535 538 539 539 540 540 542 54 4 545 545 545 545 548 553 553 555 555 555 555 556 557 558 558 559
С одержание 15 Интерфейс IteraЫe 559 Интерфейс ReadaЫe 560 Интерфейс AutoCloseaЫe 560 ИнтepфeйcThread.UncaughtExceptionHandler 560 Подпакеты из пакета вjava.lang 561 Пакетjava.lang. annotation 561 Пакетjava.lang. instrument 561 Пакетjava.lang.invoke 561 Пaкeтjava.lang.management 561 Пакетjava.lang.re f 562 Пакетjava.lang.reflect 562 Глава 18. Пакет java. util, часть 1. Collections Framework 563 Краткий обзор коллекций 564 Изменения каркаса коллекций в версииJDК 5 566 Обобщения коренным образом изменили каркас коллекций 566 В средствах автоматической упаковки используются примитивные типы данных 567 Цикл for в стиле for each 567 Интерфейсы коллекций 567 Интерфейс Collection 568 Интерфейс List 571 Интерфейс Set 573 Интерфейс SortedSet 573 Интерфейс NavigaЬleSet 574 Интерфейс Queue 576 Интерфейс Dequeue 577 Классы коллекций 579 Класс ArrayList 580 Класс LinkedList 584 Класс HashSet 585 Класс LinkedHashSet 587 Класс TreeSet 587 Класс PriorityQueue 588 Класс ArrayDeque 589 Класс EnumSet 590 Доступ к коллекциям через итератор 591 Применение интерфейса Iterator 593 Цикл for в стиле for each как альтернатива итераторам 595 Итераторы-разделители 596 Сохранение объектов пользовательских классов в коллекциях 599 Интерфейс RandomAccess 600 Обращение с отображениями 601 Интерфейсы отображений 601 Классы отображений 609 Компараторы 614 Применение компараторов 617 Алгоритмы коллекций 622 Массивы 629 Унаследованные классы и интерфейсы 634
ИнтepфeйcEnurneration Класс Vector Класс Stack Класс Dictionary Класс Properties Применение методов store () и load () ЗакточитеD�Rые с:о о6раже ния по поводу коллекций :j:, 635 635 639 641 645 649 650 Тhава 19. Пакет java. ui:il, часть 11. Прочие служебные массы 651 '�ii Клас с StringTokenizer 651 Класс Bi tSet 653 Класс�-��.1 1. ���J)j)μЬle. ОрЦоnа1 J;nt и Qpt.i,onalLoдg - �56 Класс Date 659 Класс Calendar , 661 Класс GregorianCalenda:r 664 Класс Timё-Zohe 666 Класс SimpleT"imeZone 667 Класс Locale 668 Класс Randorn 670 Класс ObservaЫe 672 Интерфейс Observer 673 Пример аабцщеиия за объектами 674 Класс1� �1 Timer и TimerTask 676 Класс Currency 678 КлaccFormatter 680 Конструкторы класса Forrnatter 680 Методы изклиса Forrnatter 681 Основы форматирования 682 Форматкро881 11 1 е строк и символов 684 Форматирование чисел 684 Форматирование арекеви и даты 685 СпецифюСаrорwфQрJ�мта%nи %% 687 Указание llJl ll llifВJDI Н oй ширины поля 687 УIСаЗаНИе � 689 Применение признаков формата 689 Выравнквавне выводимых данных 690 Признаки пробе.il а ,+ , Ои( 691 Признак запятой 692 ПризаЬ 692 Прописные формы спецификаторов формата 692 ПрИ1i:�h�'wидеЬ'аJЯ7м'&га 693 Закрытие объепа типа Forrnattеr 694 Аналоr фунJСЦИирrintf (} вJava 695 Класс Scanner 695 Конструкторы класса Scanner 695 Некоторые примеры применения класса Scanner 700 Установка разделителей 704 Прочие средства uacca Scanner 705 Классы ResourceBundle, ListResourceBundle и PropertyResourceBundle ' 706
Содержание 17 Пр очие служеб ные кла ссы и интерфей сы 710 Пa кeты java.util.concurrent ,java.util.concurrent. atomic ,java.util.concurrent.locks 712 Па ке т java.util. function 712 Па ке т java.util. jar 716 Па кет java.util.logging 716 Па кет java.util.prefs 716 Па кет java.util.regex 716 Па ке т java.util.spi 716 Па кет java.util.stream 716 Па кет java.util.zip 716 Глава 20. Пакет java. io для ввода-вывода 717 Кла ссы и интерфей сы ввода -вывода 718 Кла ссFile 718 Каталоги 722 Пр именение интерфей са FilenameFilter 723 Ал ьтер на ти вный метод listFiles () 724 Со здан ие катало гов 724 Ин терфей сы AutoCloseaЫe ,CloseaЫe и FlushaЫe 724 Исключения ввода -вывода 725 Два сп особа закрытия пото ка ввода -вывода 726 Кла ссы потоков ввода -вывода 727 По токи ввода -вывода байтов 728 Кла сс InputStream 728 Кла ссOutputStream 729 Кла ссFileinputStream 730 Кла ссFileOutputStream 732 Кла сс ByteArrayinputStream 734 Кла сс ByteArrayOutputStream 736 Фильтруе мые пото ки ввода -выво да байтов 737 Буферизова нные потоки вво да-выво да байтов 737 По токи ввода -вывод а си мв олов 748 Кла ссReader 749 Кла ссWriter 750 Кла ссFileReader 751 Кла ссFileWriter 751 Кла сс CharArrayReader 752 Кла ссCharArrayWriter 754 Кл асс BufferedReader 755 Кла сс BufferedWriter 756 Кла сс PushbackReader 757 Кла сс PrintWriter 758 Кла сс Console 759 Се риализация 761 Ин терфей сSerializaЫe 762 Инте рфей с ExternalizaЫe 762 Ин терфей сObjectOutput 763 Кла ссObjectOutputStream 763 Интерфей сObject Input 764
18 Содержа н ие Класс ObjectlnputStream 765 Пр имер сериализации 767 Пр еимущес тва по токов ввода -вывода 768 Глава 21. Система ввода-вывода NIO 769 Клас сы сис темы ввода -вывода NIO 769 Ос новные положения о сис теме ввода -вывода NIO 770 Буфера 770 Кан алы 772 Наборы символов и селе кторы 774 Ус овершенс твования в системе NIO, начиная с версииJDК 7 774 Ин те рфейс Path 774 Кла сс Files 776 Кла сс Paths 779 Ин терфейсы атрибу тов файлов 780 Кла ссы FileSystem, FileSystems и FileStore 782 Пр именение сис темы ввода -вывода NIO 782 Пр именение сис темы NIO для ка нально го ввода -вывода 783 Пр именение системы NIO для по токово го ввода -вывода 793 Пр именение сис темы ввода -вывода NIO для операций в файловой сис теме 796 Пр имеры ор ганизации ка нально го ввода -вывода до версии JDК 7 804 Чт ение из файла до версии JDК 7 804 За пись в файл версии до JDK 7 807 Глава 22. Работа в сети 811 Основыработы в сети 811 Се те вые классы и ин терфейсы 813 Кла сс InetAddress 813 Фа бричные методы 814 Ме тоды экземпляра 815 Клас сы Inet4Address и InetбAddress 815 Кли ен тские со кеты по протоколу ТСР/IP 816 Кла сс URL 819 Кла сс URLConnection 821 Кла сс HttpURLConnection 824 Класс URI 826 Со оkiе -ф айлы 826 Се рверные со кеты по про токолу ТСР/IP 827 Де йта граммы 827 Кла сс DatagramSocket 828 Кла сс DatagramPacket 829 Пр имер обработ ки дейта грамм 830 Глава 23. Класс Applet 833 Два ти па апле тов 833 Ос новы разрабо тки апле тов 834 Кла сс Applet 835 Стру ктура апле тов 837 Ске ле т аплета 838 Ин ициализация и пре кращение рабо ты апле та 839
Содержание 19 Пе реопределение метода update () 840 Простые методы воспроизведения аплетов 841 За прос на повторное воспроизведение 843 Пр остой аплет с баннером 844 Пр именениестро ки сос тояни я 846 НТМL-дескриптор APPLET 847 Пе редача параметров апле там 848 Ус овер шенствование аплета, воспроизводящего баннер 850 Ме тоды getDocшnent Base () и getCode Base ( ) 851 Ин те рфейс AppletContext и метод showDocument () 852 Ин те рфейс AudioClip 854 Инте рфейс AppletStub 854 Ко нсольный вывод 854 Глава 24. Обработка событий 855 Два механизма обрабо тки событий 855 Мо дель деле гирования событий 856 Со быти я 856 Источники событий 857 Пр иемни ки событий 857 Кла ссы событий 858 Кла сс Action Event 859 Кла сс Adjustment Event 860 Кл асс Component Event 861 Кла сс Container Event 861 Кла сс Focus Event 862 Кла сс Input Event 863 Кл асс Item Event 864 Кл асс Key Event 864 Кла сс Mouse Event 865 Кла сс MouseWheel Event 867 Кла сс Text Event 868 Кла сс Window Event 868 Ис точни ки событий 870 Ин терфейсы приемников событий 870 Ин терфейс ActionListener 871 Ин те рфейс AdjustmentListener 871 Ин те рфейс ComponentListener 872 Ин те рфейс ContainerListener 872 Ин терфейс FocusListener 872 Ин те рфейс ItemListener 872 Ин те рфейс KeyListener 872 Ин те рфейс MouseListener 873 Интерфейс MouseMotionListener 873 Ин терф ейс MouseWheelListener 873 Ин те рфейс TextListener 873 Ин терфейс WindowFocusListener 873 Ин терфейс WindowListener 873 Пр именение модели деле гирования событий 874 Об работка событий от мы ши 874 Об работка событий от клавиа туры 877
20 Содержание Кл ассы адаптеров 880 Внугренние кла ссы 882 Ан они мные внугренние кл ассы 883 Глава 25. Введение в библиотеку АWТ: работа с окнами, графикой и текстом 885 Кл ассы библиоте ки АWГ 886 Основные положения об окнах 888 Кл асс Component 889 Кл асс Container 889 Кл асс Panel 889 Кл асс Window 890 Кл асс Frame 890 Кл асс Canvas 890 Работа с обра мляющи ми окна ми 890 Установ ка раз меров окна 891 Со кр ытие и отображение окна 891 Установ ка за головка окна 891 За кр ыт ие обра мляюще го окна 891 Со здание обра мляюще го окна в аплете , по строенно м на основе библиоте ки АWГ 892 Об работк а со бытий в обра мляюще м окне 894 Со здание оконной прикладной про гра ммы 898 От обр ажение инфор мации в окне 899 Поддержка графики 900 Ри сован ие линий 900 Ри сование пря моу го льни ков 900 Ри сование эллип сов и окруж но стей 901 Ри сование дуг 901 Ри сование мн огоу гольни ков 901 Де мо нстрация ме тодов ри сования 902 Из менение раз меров гр афики 902 Работа с цвето м 904 Методыиз класса Color 905 Уста нов ка режи ма ри сования 907 Работа со шрифта ми 909 Оп ределение до ступных шрифтов 910 Со зда ние и выбор шрифта 911 По лучение св едений о шрифте 913 Уп равление фор матирование м выводи мого те кста 914 От ображение мн огострочно го те кста 915 Це нтров ка те кста 917 Выравни вание мн огострочно го те кста 918 Глава 26. Применение элементов управления, диспетчеров компоновки и меню из библиотеки АWТ 923 Основн ые положения об эл ементах управления 924 Ввод и уд аление эл ементов управления 924 Реа гирование на эл емент ы управления 925 Исключение ти па HeadlessException 925
С одержани е 21 Метки 925 Экранные кнопки 926 Обработка событий от кнопок 927 Флажки 930 Обработка событий от флажков 931 Кнопки-переключатели 932 Элементы управления выбором 934 Обработка событий от раскрывающихся списков 935 Использование списков 936 Обработка событий от списков 938 Управление полосами прокругки 939 Обработка событий от полос прокругки 941 Текстовые поля 943 Обработка событий в текстовых полях 944 Текстовые области 945 Диспетчеры компоновки 947 Класс FlowLayout 948 Класс BorderLayout 950 Вставки 952 Класс GridLayout 953 Класс CardLayout 954 Класс GridBagLayout 957 Меню и строки меню 962 Диалоговые окна 968 Диалоговые окна выбора файлов 972 О переопределении метода paint () 973 Глава 27. Изображения 975 Форматы файлов 975 Основы работы с изображениями: создание, загрузка и отображение 976 Создание объекта класса Image 976 Загрузка изображения 977 Воспроизведение изображения 977 Интерфейс ImageObserver 979 Двойная буферизация 980 Класс MediaTracker 983 Интерфейс ImageProducer 986 Класс MemoryimageSource 986 Интерфейс ImageConsumer 988 Класс PixelGrabber 988 Класс ImageFilter 991 Класс CropimageFil ter 991 Фильтр класса RGBimageFil te r 992 Дополнительные классы для формирования изображений 1004 Глава 28. Утилиты параллелизма 1005 Пакеты параллельного API 1006 Пaкeтjava.util.concu rrent.atomic 1008 Пакет java. util.concurrent.locks 1008 Применение объектов синхронизации 1008
22 с.,. .. .. Класс Semaphore 1008 КлaccCountDownLatch 1014 Класс CyclicBarrier 1016 Класс Exchanger 1018 Класс Phaser 1020 Применение JКПшвите.u 1028 Простое llpю&ep JSCJIQ1UfитeлЯ 1029 ПрвменеJ1 11е �k�C'allab].e и Future 1031 ПеречиСJ1евие TimeUni t lOM ПapaмeJIЬl lJile JCOJ JJie xци и 1035 БлQDlpoВlal 1036 Аrомар1Ще оnераци и 1039 Пара.цельное програм ми рование средствами Fork/Join Framework 1040 Основные массы Fork/jmn ·F\!arnework 1041 Стра� "pa aAC"ui Иuаствуй" 1045 Первый 11роСТQЙ дрвмер вилочного соединения 1047 ВJu uaиe )'ро11 118 llapiJIJleJUIЗМЗ 1049 Пр11Мер.црм ме -.е1U1ВJtl laC ca Recursi veTask<V> 1053 Acивxpc»l lJIQe a,Ji i1 110JD1 eвиe задач 1055 Onleиa Зl ltJU' Чl l 1056 Определевие состо•ния завершения задачи 1056 Перезапуааад;аЧ1 1 1056 Предмет д;uьвеiЦuеrо изучения 1057 Реаомен.а аци и �.О'QiОС1 1'1'е.1 1 но вилочного соединения 1059 УТИJIИТЫ �в сравнении страдJtционным подходом к :мвогоза,рчвости вjava 1059 'IЛава 29. Потокоаwй API 1001 Основные поло.ения о поrоках данных 1061 ПотоковыеивтерфеiсЬl·i1 · 1062 Получение1Ю'1'Оаuи иых 1065 Простойпримерпотокадан ных 106 6 Операци и свцен ня 1070 Пара.1 11 1 еJ1ЬНЫепотокидан н ых 1073 Оrобрuквие 1075 Нuоплеиие 1079 ИтераrорыиJЮТОКНда1 1ИЬ1Х 1083 Примевевве итератора в потоке данных 1083 ПрИке1 1 евие итератора-разделителя 1085 Дальнейшее� IIOТOJWвoro API 1087 Тhава 30. Реrу.яарвые вwражеВИJ J и другие пакеты 1089 I1ахетЬ1избаэо11ОrоAPI 1089 Обработка реrулярЩIХ выражений 1092 Класс Pa't'tern· 1092 Класс Matcher 1092 Синтцсис реrут�рных выраженИй · 1'J93 Примеры, деы9истрирующие совпадениеt шаблоном 1094 Два варианта сопОСТС1JU1еnИя с шаблоном 1100 Дальнейшее изучение реrулярnых. вьmажеиий 1100 Рефлексия ·' ' · .--:-� ·· 1101
Содержани е 23 Уд але нн ый вызов методов 1105 Пр остое приложение "кл иент -сервер ", использующее ме ханизм RMI 1105 Фо рмати рование дат ы и времени средствами пакета j ava.text 1109 Кла сс DateFormat 1109 Класс SimpledateFormat 1111 API дат ы и времени, внедренн ый в версииJDK 8 1113 Ос новн ые классы дат ы и времени 1113 Фо рматирование даты и времени 1115 Си нта ксичес кий анализ си мвольн ых стро к дат ы и времени · 1117 Дальнейшее из учение па кета j аvа . time 1118 Часть 111. Введение в программирование ГПИ средствами Swing 1119 Глава 31. Введение в библиотеку Swing 1121 Пр оисхожде ние библ иоте ки Swing 1121 По строение библиоте ки Swing на основе библиотеки АWГ 1122 Гл авн ые особенности библиоте ки Swing 1122 Ле гковесн ые ко мпонент ы Swing 1123 Под ключае мый стиль оформления 1123 Св язь с архите ктурой MVC 1124 Ко мпоненты и ко нтейнеры 1125 Компонент ы 1125 Контейнер ы 1126 Па нели ко нтейнеров верхне го уровня 1126 Па кет ы библиоте ки Swing 1127 Пр остое Swing-приложение 1127 Об работ ка соб ытий 1132 Со зда ние Swing-aпл eтa 1135 Рисование средствами Swing 1138 Ос нов ы рисования 1138 Вычисление области рисования 1139 Пр имер рисован ия 1140 Глава 32. Исследование библиотеки Swing 1143 Класс ы JLabel и Imageicon 1143 Кл асс JTextField 1145 Кноп ки из библиоте ки Swing 1147 Кл асс JButton 1148 Кла сс JToggleButton 1150 Фл ажки 1153 Кноп ки -п ереключатели 1155 Класс JTabbedPane 1157 Кла сс JScrollPane 1160 Класс JList 1162 Класс JComboBox 1166 Де ревья 1168 Кл асс JTаЫе 1172 Ос новн ые положения о меню 1175
2' Содержани е Глава 33. Введение в меню Swing 1175 Кр ат кий обзор кла ссов JМenu Bar , JМenu и JМenu Item 1177 Клас с JMenu Bar 1177 Клас с JMenu 1178 Клас с JMenuitem 1180 Создание гл авного меню 1180 Вв од мнемоники и опера тивных клавиш в ме ню 1184 Вв од изображений и всплывающих подс казо к в пу нкты ме ню 1187 Кл ассыJRadio ButtonMenuitem и JCheck BoxMenuitem 1188 Со здание вс плываю щего ме ню 1190 Со зда ние па нели ин ст руме нтов 1193 Де йствия 1196 Со ставле ние око нч атель но го вариа нта про граммы MenuDemo 1202 Дал ьнейшее изуче ние библиотеки Swing 1208 Часть IV. Введение в программирование ГПИ средствами JavaFX 1209 Глава 34. Введение вJavaFX 1211 Ос но вные по нятия Jа vаFХ 12 12 Па кетыJаvаFХ 1212 Кла ссы подмостков и сце ны 1213 Узлыи графы сцены 1213 Компо новки 1213 Клас с приложения и методы его жизненно го цикла 12 14 За пускJаvа FХ-приложе ния 12 14 Скел етJа vаFХ-пр ило же ния 12 15 Компиляция и выполнениеJаvаFХ-п риложения 1218 Пото к испол нения приложе ния 12 19 Ме т ка -про стейший элеме нт управле ния вJavaFX 12 19 Пр имене ние кнопок и со бытий 122 1 Ос новы обработ ки событий вJa vaFX 1 222 Эл еме нт управления экранной кноп кой 1223 Де мо нстрация обр аботки со бытий на примере экра нных кнопо к 1224 Рисов ание не посредстве нно на холсте 1227 Глава 35. Элементы управленияJavaFX 1233 Класс ы Image и ImageView 1233 Вв од изобр ажения в метку 1236 Пр име нение изображе ния в экранной кн оп ке 1238 Кл ас с Toggle Button 1240 Кла сс Radio Button 1243 Об работ ка со бытий изменения в гр уппе кн опо к-переключателей 1246 Др угой способ управле ния кноп ками -переключ ателями 1248 Кла сс Check Box 125 1 Кл асс ListView 1254 Пред ставление сп ис ка с полосами прокрутки 1258 Активизация режим а од новреме нно го выбора не скольких элеме нтов из сп иска 1258 Кл асс СоmЬоВох 1260 Класс TextField 1263 Класс ScrollPane 1265 Кла сс TreeView 1269
С оде ржание 25 Эффекты и преобразования 1273 Эффекты 1274 Преобразования 1275 Демонстрация эффектов и преобразований 1276 Ввод всплывающих подсказок 1279 Отключение элементов управления 1280 Глава 36. Введение в менюJavaFX 1281 Основные положения о меню 1281 Краткий обзор классов MenuBar, Menu и Menuitem 1283 Класс MenuBar 1283 Класс Menu 1284 Класс Menuitem 1285 Создание главного меню 1286 Ввод мнемоники и оперативных клавиш в меню 1291 Ввод изображений в пункты меню 1293 Классы RadioMenuitem и CheckMenuitem 1294 Создание контекстного меню 1296 Создание панели инструментов 1300 Составление окончательного варианта приложения MenuDemo 1302 Дальнейшее изучениеJаvаFХ 1308 Часть V. Применение Java 1309 Глава 37. КомпонентыJаvа Beans 1311 Общее представление о компонентахJava Beans 1311 Преимущества компонентовjаvа Beans 1312 Самоанализ 1312 Шаблоны проектирования для свойств компонентовJava Beans 1313 Шаблоны проектирования для событий 1314 Методы и шаблоны проектирования 1315 Применение интерфейса Beaninfo 1315 Привязанные и ограниченные свойства 1315 Сохраняемость компонентовJava Beans 1316 Настройщики 1316 Прикладной программный интерфейсJаvа Beans API 1317 Класс Introspector 1319 Класс PropertyDescriptor 1319 Класс EventSetDescriptor 1319 Класс MethodDescriptor 1319 Пример компонентаjаvа Bean 1320 Глава 38. Введение в сервлеты 1323 Предпосылки для разработки сервлетов 1323 Жизненный цикл сервлета 1324 Варианты разработки сервлетов 1325 Применение контейнера сервлетов Tomcat 1325 Простой пример сервлета 1327 Создание и компиляция исходного кода сервлета 1327 Запуск контейнера сервлетов Tomcat на выполнение 1328 Запуск веб-браузера и запрос сервлета 1328
26 Содержани е Пр икладной про гра ммный интерф ейс Servlet API Па кет j avax. servlet Ин терф ейс Servlet Ин терф ей с Servlet Con fig Ин терфейс Servlet Context Инте рфейс Servlet Request Ин те рфейс Servlet Responce Кла сс GenericServlet Кла сс ServletinputStream Кла сс ServletOutputStream Кла сс Servlet Exception Ввод пара метров сервлета Па кет j avax. servlet. http Ин терфейс HttpServlet Request Ин терф ейс HttpServlet Response Инте рфейс HttpSession Кла сс Cookie Класс HttpServlet Об работка НТТР -запросов и ответов НТТР Об работка НТТР-запросов типа GET Об работка НТТР -запросов типа POS T Пр именение соо kiе -ф айлов От слежива ние сеансов св язи Приложение А. Применение документирующих комментариев вJava Де скриптор ы утилиты javadoc Дескриптор $author Де скрип тор { @code} Де скриптор @deprecated Де скриптор { @doc Root} Дескриптор @exception Дескриптор { @inheritDoc} Дескриптор {@link} Де скриптор {@linkplain} Дескриптор { @literal} Дескриптор @param Де скриптор @return Дескриптор @see Дескриптор @serial Дескриптор @serialData Де скриптор @serialField Де скрип тор @since Дескр ип тор @throws Дескрипто р {@value} Де скриптор @version Об щая фор ма документирую щих ком ментариев Результаты , выводи мыеутилитой javadoc Пр имер при менения до кументирующих ко мментари ев Предметный указатель 1329 1329 1330 1330 1331 1331 1332 1333 1333 1333 1333 1334 1335 1336 1337 1338 1339 1340 1341 1341 1342 1343 1346 1347 1347 1348 1349 1349 1349 1349 1349 1350 1350 1350 1350 1350 1350 1351 1351 1351 1351 1352 1352 1352 1352 1353 1353 1355
'" Об авто ре Герберт Шилдт являет ся автором мно гочи сленных кн иг по про граммирова­ нию, пользующих ся большим успехом у чи тателей в течение почти трех де сяти­ лети й, а также признанным авторитетом по язы куJa va. Его кн иги продают ся мил ­ лионными тир ажами и переведены на мно гие язы ки мира. Его перу принадлежит немало кн иг по Ja va, в том чи сл е Ja va: руководство для начинающих, ja va: методики програм м ир ования Ши.лдта, SWING: руководство для начинающих, Искусство програм­ мирования наJa va, а также настоящее издан ие. Он написал немало кн иги по дру гим язы кам про граммирования , включая С, С++ и С#. Ин тере суя сь всеми аспе ктами вы числительной тех ни ки, Ге рберт уд еляет основное внимание язы кам про гр ам­ ми рования и, в ча стно сти , ко мпиля торам , интерпретаторам и язы кам упра вле ­ ния роботами. Он та кже проя вляет большой интере с к ст андартизации язы ков. Ге рберт окон чил Иллиной ски й универ ситет, получив обе ст епени - ба калавра и ма гистра. По дробнее об авторе можно узнать, по сетив его веб -сайт по адре су www .Herb S childt . com. О научном редакторе Д·р Дзиви Ковард реда ктировал все издания этой кн иги. Он ввел понятие се рв­ ле тов Jаvа в первую вер сию платформыJа vа ЕЕ, внедрил веб -службы на платформе Java МЕ, со ставил общую ст рате ги ю и пла н разработ ки вер сии jаvа SE 7. Он так­ же заложил основы техноло гии Jа vаFХ, а со всем недавно разработал са мое кр уп­ ное допол нение к ст андарту Java ЕЕ 7 и пр икладному про граммно му интер фей су Ja va WeЬSocket API . Д-р Ковард обладает необычайно обширными знаниями все х аспе ктов техноло гииJа vа: от про граммирования нaJava и до разработ ки пр иклад­ н ых программных интерфейсов API вместе сопытными специалистам и в данной обла сти , а та кже мно голетним опытом работы в испол нител ьном ко митете Ja va Community Process. Он та кже являет ся автором кн и ги Ja vaWebSocket Programmiпg и го товящей ся к изданию кни ги поJa va ЕЕ. Д -р Ковард окончил Оксфорд ский уни­ ве рситет, получив сте пени ба калавра , ма гистра и до ктора математиче ских нау к.
28 П редисловие П ред исловие Java - оди н из самых важн ых и широко применяемых языков программирова­ ния в мире на протяжении многих лет. В отличие от некоторых других языков программирования, вл ияниеJ ava не только не уменьшилось со временем, а, наобо­ рот, возросло. С момента первого выпуска он выдвинулся на передний край про­ граммирования приложений для Интернета. И каждая последующая версия лишь укрепляла эту позицию. НынеJava по-прежнему остается первым и самым лучшим языком для разработки веб-ориентированных приложений. Проще говоря , баль­ шая часть современного кода написана нa java. И это свидетельствует об особом значении языкаjаvа для программирования. Основная причина ycпexajava - его гибкость. Начиная с первой верс ии 1.0, этот язык непрерывно адаптируется к изменениям в среде программирования и подхо­ дам к написанию программ. А самое гл авное - он не просто следует тенде нциям в программировании, а помогает их создматъ. СпособностьJava адаптироваться к бы­ стрым изменениям в вычислительной технике служит основной причиной , по кото­ рой этот язык программирования продолжается оставаться столь успешным. Со времени публ икации первого издания этой книги в 1996 году она претерпе­ ла немало изменений , которые отражал и последовательное развитие языка Java. Настоящее, девятое, издание обновлено по версииjаvа SE 8 (JDK 8). А это означает, что оно содержит немало нового материала, поскольку в версии jаvа SE 8 появился ряд новых языковых средств. Наиболее важными из них являются лямбда-выраже­ ния , вводящие совершенно новый синтаксис и существенно повышающие вырази­ тельную силу языка. Вследствие особого значения лямбда-выражений им посвящена отдельная гл ава, а примеры их применения приведены и в других гл авах. Внедрение лямбда-выражений повлекло за собой появление других новых языковых средств. К их числу относится библиотека потоков ввода-вывода, входящая в пакет j ava . util . stream и поддерживающая конвейерные операции с данными. Этой библи­ отеке также посвящена отдельная гл ава. Еще одним нововведением является метод по умолчанию, позволяющий вводить в интерфейс функциональные возможности, используемые по умолчанию. А такие средства, как повторяющиеся и типовые анно­ тации, дополнительно повышают эффективностьjаvа. В версии jаvа SE 8 сделаны также значительные ус овершенствования в библиотеке Java API , и некоторые из них описываются в этой книге. Еще одним важным дополнением настоящего издания служит описание JavaFX - новой технологии Java для построения графического пользовательско­ го инте рфейса (ГПИ) приложений нa java. В перспективе JаvаFХ отводится суще­ ственная роль в разработке приложений нa java, и поэтому этой технологии по­ священы три отдел ьные гл авы. Это означает, что программирующим на Java про­ сто необходимо овладеть тех нологией JavaFX. Еще одна гл ава книги посвящена разработке меню средствами Swing. Несмотря на то что технология jаvаFХ может в перспективе полностью заменить технологию Swing, на момент выхода настоя­ щего издания Swing по-прежнему широко применяется для построения ГПИ при­ ложений на Java , и поэтому подробное рассмотрение этой технологии в настоя­ щем издании вполне обоснованно. И наконец, в отдел ьных гл авах упоминаются многочисленные мелкие усовершенствования в версии jаvа SE 8.
Книга для всех программистов Предисловие 29 Эта книга предназначена для всех категорий программистов: от начинающих до опытных. Начинающий программист найдет в ней подробные пошаговые опи­ сания и немало полезных примеров написания кода на Java , а углубленное рас­ смотрение более сложных функций и библиотекjаvа должно привлечь внимание опытных программистов. Для обеих категорий читателей в книге указаны дей­ ствующие ресурсы и полезные ссылки. Структура кн иги Эта книга служит исчерпывающим справочным пособием по языкуJava, в кото­ ром описываются его синтаксис , ключевые слова и основополагающие принципы программирования. В ней рассматривается также значительная часть библиотеки Java API . Книга разделена на пять частей, каждая из которых посвящена отдел ьно­ му аспекту среды программированияjаvа. В части 1 представлено подробное учебное пособие по языкуJava. Она начинается с рассмотрения таких основных понятий, как типы данных, операции, управляющие операторы и классы. Затем описываются правила наследования , пакеты, интерфей­ сы, обработка исключений и многопоточная обработка. Далее рассматриваются ан­ нотации, перечисления, автоупаковка, обобщения, операции ввода-вывода и аплеты. А заключительная гл ава этой части посвящена лямбда-выражениям, которые, как упо­ миналось ранее, являются самым важным нововведением в версииjаvа SE 8. В части 11 описываются основные компоненты стандартной библиотеки Java API. В ней обсуждаются следующие во просы: символьные строки, операции вво­ да-вывода, работа в сети , стандартные утилиты , каркас коллекций Collections Framework, аплеты , библиотека АWГ, обработка событий, формирование изобра­ жен ий, параллельная обработка (включая каркас Fork/Join Framework) , регуля р­ ные выражения и новая библиотека потоков ввода-вывода. Часть 111 состоит из трех гл ав, посвященных технологии Swi ng, а часть IV - из такого же количества гл ав , посвященных технологииJаvаFХ. Часть V состоит из двух гл ав с примерами практического примененияJava. Сначала в ней рассматривается технологияjаvа Beans, а затем представлены сервлеты. Исходный код примеров, доступный в Интернете Помните , что исходный код всех примеров, приведенных в этой книге, до­ ступен на веб-сайте издательства Oracle Press по адресу http://www .mhprofes­ sion al . com /product .php ?isbn=0 071808558 ил и с сайта Издател ьского дома "Вильяме" по адресу: http: / / archive .williamspuЫishing . com/ cgi-Ьin/ ma terials . cgi ?isbn= 978-5 -8459-1918-2 .
30 П редисловие Особые бл агода рно сти Выражаю особую благодарность Патрику Нотону (Patrick Naughton) , Джо О'Нилу (Joe O'Neil) и Дэнни Коварду (Danny Coward ). Патрик Нотон был одним из создателей языка Jаvа. Он помог мне в написании первого издания этой книги. Значительная часть материала гл ав 20, 22 и 27 была предоставлена Патриком. Его проницательность, опыт и энергия в огромной сте­ пени способствовали успеху этой книги. При подготовке второго и третьего издан ий этой книги Джо О'Нил предоста­ вил исходные черновые материалы, которые послужили основанием для написа­ ния гл ав 30, 32, 37 и 38. Джо помогал мне при написании нескольких книг, и я вы­ соко ценю его вклад. Дэнни Ковард выполнил научное редактирование книги . Он принимал участие в работе над несколькими моими книгами, и его полезные советы , поучительные замечания и дельные предложения всегда были ценными и достойными большой признател ьности . Гер берт Шилдт Допол нител ь ная л ите ратура Настоя щее издание открывает серию книг ·по програм мирован ию нa java, на­ писанных Ге рбертом Шилдтом. Ниже перечислены другие книги этого автора, ко­ то рые могут вас заинтересовать. • Ja va: методики прогр ам м ир ования Шил дта. И.Д . "Вильяме", 2008 г. • Ja va: руководство для на'Чинающих, 6-е изд. И.Д . "Вильяме", 2015 г. • SWING: руководство для на-чинающих. И.Д . "Вильяме", 2007 г. • Искусство програм м ир ования на]аvа. И .Д . "Вильяме", 2005 г.
ЧАСТЬ 1ГЛАВА 1 История и развитие языка Java ГЛАВА 2 Краткий обзор Java ГЛАВА З Типы данных, переменные и массивы ГЛАВА 4 Операции ГЛАВА 5 Управляющие операторы ГЛАВА 6 Введ ение в кла ссы ГЛАВА 7 Подробное рассмотрение кл ассов и методов ГЛАВА 8 Наслед ование ГЛАВА 9 Пакеты и инте рфейсы ГЛАВА 10 Обработка исключений ГЛ АВА 11 Многопоточ ное прогр аммирование ГЛ АВА 12 Перечисления, автоупа ковка и аннота ции !мета данные) ГЛАВА 13 Ввод-вывод, аплеты и про чие вопросы ГЛ АВА 14 Обобщения ГЛАВА 15 Ля мбда-выражения Язык Java
1 История и развитие языка Java Чтобы дос конально изучить язык программирования jаvа, следует понять при­ чины его создания , факторы, обусловившие его формирование, а также унасле­ дованные им особенности. Подобно другим уд ачным языкам программирования, предшествовавшим Java, этот язык сочетает в себе лучшие элементы из своего богатого наследия и новаторские концепции, применение которых обусловлено его особым положением. В то время как остальные гл авы этой книги посвящены практичес ки м вопросам программирования нa Java, в том числе его синтаксису, библиотекам и приложениям, в этой гл аве поясняется , как и почему был разра­ ботан этот язык, что делает его столь важн ым и как он развивался за годы своего существован ия. Несмотря на то что язык Java неразрывно связан с Инте рнетом, важно пом­ нить, что это , прежде всего , язык программирования . Разработка и усовершен­ ствование языков программирования обусловлены двумя основными причинами: • адаптация к изменяющимся средам и областям применения; • реализация улуч шений и усовершенствований в области программирования. Как будет показано в этой гл аве , разработка языка jаvа почти в равной мере была обусловлена обеими этими причинами. П роисхождение Java Язык Jаvа те сно связан с языком С++, который, в свою очередь, является пря­ мым наследником языка С. Многие особенности Jаvа унаследованы от обоих этих языков. От С языкJаvа унаследовал свой синтаксис, а многие его объектно-ориен­ тированные свойства были перенесены из С++. Собственно говоря , ряд определя­ ющих характеристик языка Java был перенесен - или разработан в ответ на воз­ никшие потребности - из его предшественников. Более то го , созданиеjаvа свои­ ми ко рнями уходит гл убоко в процесс усовершенствования и адаптации, который происходит в языках программирования на протяжении нескол ьких последних десятилети й. Поэтому в этом разделе рассматривается последовател ьность со-
3, Часть 1. Язы к Java бытий и факторов, приведш их к появлению J ava. Как станет ясно в дальнейшем, каждое новшество в архитектуре языка, как правило, было обусловлено необхо­ димостью найти решение той или иной основной проблемы, которую не могли разрешить существовавшие до этого языки. И Java не является исключением из этого правила. За рождение современного п рогра ммирова ния : язы к С Язык С буквально потряс компьютерный мир. Его вл ияние нельзя недооцени­ вать, поскольку он полностью изменил подход к программирован ию. Создание языка С было прямым следствием потребности в структурированном, эффектив­ ном и высокоуро вневом языке , который мог бы заменить код ассемблера в процес­ се создания систе мных программ. Как вы, вероятно, знаете, при проектировании языка программирования часто приходится находить компромиссы между: • простотой использования и предоставляемыми возможностями; • безопас ностью и эффективностью; • усто йчивостью и расширяемостью. До появления языка С программистам, как правило, приходилось выбирать между языками , которые позволял и оптимизировать тот или иной ряд характе­ ристик. Та к, на языке FORTRAN можно было писать достаточно эффективные программы для научных вычислений, но он не очень подходил для написания системного кода. Аналогично язык BASIC был очень прост в изучении, но у него было не очень много фун кциональных возможностей, а недостаточная структу­ рированность ставила под сомнение его полезность для написания крупных про­ грамм. На языке ассемблера можно писать очень эффективные программы, но его трудно изучать и эффективно использовать. Более того , отладка ассемблерного кода может оказаться весьма сложной задачей. Еще одна усложнявшая дело проблема состояла в том, что первые языки про­ граммирования вроде BASIC, COBOL и FORTRAN были разработаны без учета принципов структурирования. Вместо этого основными средствами управления программой в них были операторы безусловного перехода GOTO. В результате программы, написанные на этих языках, проявляли тенденцию к появлению так называемого "макаронного кода" - множества запутанных переходов и условных ветвей , кото рые делали программу едва ли доступной для понимания. И хотя язы­ ки наподобие Pascal структурированы, они не были предназначены для написания эффективных программ и лишены ряда важных средств, необходимых для напи­ сания разнообразных программ. (В частности , применять Pascal для написания системного кода было нецелесообразно, принимая во внимание наличие несколь­ ких стандартных диалектов этого языка.) Та ким образом, до изобретения языка С, несмотря на затраченные усилия, ни одному языку не уд авалось разрешить существовавшие в то время противоречия в программировании. Вместе с тем потребность в таком языке становилась все бо­ лее насущной. В начале 1970-х годов началас ь компьютерная революция, и потреб­ ность в программном обеспечении быстро превысила возможности программи-
Гл ава 1. История и развитие языка Java 35 стов по его созданию. В академических кругах большие усилия были приложены к созданию более совершенного языка программирования. Но в то же время стало все больше ощущаться вл ияние еще одного, очень важного фактора. Компьютеры, наконец, получили достаточно широкое распространение , чтобы была достигну­ та "критическая масса" . Компьютерное оборудо вание больше не находилось за за­ крытыми дверями. Впервые программисты получили буквально неограниченный доступ к своим вычислительным машинам. Это дало свободу для экспериментиро­ вания. Программисты смогли также приступить к созданию своих собственных инструментальных средств. Накануне создания С произошел качественный ска­ чок в области языков программирования. Язык С, изобретенный и впервые реализованный Деннисом Ритчи на мини­ эвм DEC PDP-11, работавшей под управлением операционной системы UNIX. явился результатом процесса разработки, начавшегося с предшествующего ему языка BCPL, разработанного Мартином Ричардсом. BCPL оказал влияние на язык, получивший название В, который бьш изобретен Кеном То мпсоном и в начале 1970-х гг. привел к появлению языка С. В течение долгих лет факти ческим стан­ дартом языка С была его версия, которая поставлялась вместе с операционной си­ стемой UNIX (она описана в книге ЯЗъtх програм м ир ования С Брайана Кернигана и Денниса Ритчи , 2-е издание, И.Д . "Вилямс", 2007 г. ) . Язык С был формально стан­ дартизован в декабре 1989 г., когда Национальный институт стандартизаци и США (American National Standards Institute -ANSI) принял стандарт на С. Многие считают создание С началом современного этапа развития языков про­ граммирования. Этот язык ус пешно соединил проти воречивые свойства, которые доставляли столько неприятностей в предыдущих языках. В итоге появился мощ­ ный , эффективный, структур ированный язык, изучение которого было сравни­ тел ьно простым. Кроме того, ему бьша присуща еще одна, почти непостижимая особенность: он бьш разработан специалъно для программистов. До появления С языки программирован ия проектировались в основном в качестве академических упражнений или бюрократическими организациями. Иное дело - язык С. О н был спроектирован, реализован и разработан практикующ ими программиста ми и от­ ражал их подход к программированию. Его функции были отлажены, проверены и многократно переработаны людьми, которые действительно пользовались этим языком. Та ким образом, получился язык, который сразу же понравился програм­ мистам. И действительно, язык С быстро приобрел много приверженцев, кото­ рые едва ли не молились на него. Благодаря этому С получил быстрое и широкое признание среди программистов. Короче говоря , С - это язык, разработанный программистами для программистов. Как станет ясно в дальнейшем, эту замеча­ тельную особенность унаследовали языкjаvа. Следующий этап: язык С++ В конце 1970-х-начале 1980-х гг. язык С стал господствующим языком про­ граммирования и продолжает широко применяться до сих пор. А если С - удач­ ный и удо бный язык, то может возникнуть вопрос: чем обусловлена потребность в каком-то другом языке? Ответ состоит в постоянно растущей С1Wжности про­ грамм. На протяжении всей истории развития программирования постоянно
36 Часть 1. Язы к Java растущая сложность программ порождала потребность в более совершенных спо­ собах преодоления их сложности . Язык С++ явился ответом на эту потребность. Чтобы лучше понять, почему потребность преодоления сложности программ яв­ ляется гл авной побудител ьной причиной создания языка С++ , рассмотрим следу­ ющие факторы. С момента изобретения компьютеров подходы к программированию корен­ ным образом изменились. Когда компьютеры только появились, программирова­ ние осушествлялось изменением двоичных машинных инструкций вручную с па­ нели управления компьютера. До тех пор, пока длина программ не превышала не­ скольких сотен инструкций, этот подход был вполне приемлем. В связи с разрас­ танием программ был изобретен язык ассемблера, который позволил программи­ стам работать с более крупными и все более сложными программами, используя символьные представления машинных инструкций. По мере того как программы продолжали увеличиваться в объеме, появились языки высокого уровня, которые предоставили программистам дополнительные средства для преодоления слож­ ности програм м. Первым языком программирования, который получил широкое распростране­ ние, бьи, конечно же, FORТRAN. Хотя он и стал первым впечатляющим этапом в программировании, его вряд ли можно считать языком, который способствует созданию ясных и простых для понимания программ. 1960-е годы ознаменовались зарождением структурного програм м ир ования. Эта методика программирования наи­ более ярко проявилась в таких языках, как С. Пользуясь структурированными язы­ ками, программисты впервые получили возможность без особых затруднений соз­ давать программы средней сложности. Но и методика структурного программиро­ вания уже не позволяла программистам справиться со сложными проектами, когда они достигали определенных масштабов. К началу 1980-х. сложность многих про­ ектов начала превышать предел, позволявший справиться с ними, применяя струк­ тур ный подход. Для решения этой проблемы бьиа изобретена новая методика про­ граммирования, получившая название об&ектн�тированного профам м ирования (ООП). Объектно-ориентированное программирование подробно рассматрива� ся в последующих гл авах, а здесь приводится лишь краткое его определение: ООП - это методика программирования , которая помогает организовывать сложные про­ граммы, применяя принципы наследования, инкапсуляции и полиморфизма. Из всего сказанного выше можно сделать следующий вывод: несмотря на то , что С является одним из лучших в мире языков программирования , существует предел его способности справляться со сложностью программ. Как только раз­ меры программы превышают определенную величину, она становится слишком сложной, чтобы ее можно было охватить как единое целое. То чная величина этого предела зависит как от структуры самой программы, так и от подходов, исполь­ зуемых программистом, но начиная с определенного момента любая программа становится слишком сложной для понимания и внесения изменений, а следова­ тельно, неуправляемой. Язык С++ предоставил возможности , которые позволили программистам преодолеть этот порог сложности , чтобы понимать крупные про­ граммы и управлять ими. Язык С++ бьи изобретен Бьярне Страуструпом (Bjarne Stroustrup) в 1979 г. , когда он работал в компании Bell LaЬoratories в городе Мюррей-Хилл, шт. Нью-
Глава 1.История и развитие языка Java 37 Джерси. Вначале Страуструп назвал новый язык "С with Classes" (С с классами). Но в 1983 г. это название бьvю изменено на С++. Язык С++ расширяет функцио­ нальные возможности языка С, добавляя в него объектно-ориентированные свой­ ства. А поскольку язык С++ построен на основе С, то в нем поддерживаются все функциональные возможности , свойства и преимущества С. Это обстоятельство явилось гл авной причиной успешного распространения С++ в качестве языка про­ граммирования. Изобретение языка С++ не бьvю попыткой создать совершенно новый язык программирования. Напротив, все усилия были направлены на усо­ ве ршенствование уже существующего очень уд ачного языка. П редпос ылки к с озданию Java К концу 1980-х и в начале 1990-х гг. объектно-ориентированное программиро­ ва ние на С++ стало основной методикой программирования. И в течение некото­ рого, хотя и непродолжительного периода времени казалось, что программисты наконец изобрели идеальный язык. Ведь язык С++ сочетал в себе высокую эффек­ тивность и стилистические элементы языка С наряду с объектно-ориентирован­ ным подходо м, и поэтому его можно было использовать для создания самых раз­ ных программ. Но, как и прежде, уже вызревали факторы, которые должны были в оче редной раз стимулировать развитие языков программирования . Прошло еще несколько лет, и развитие Всемирной паутины и Интернета достигло "критиче­ ской масс ы", что и привело к еще одной революции в программировании. Создан ие я зыка Java Начало разработке языка jаvа было положено в 1991 г. Джеймсом Го слингом (James Gosling) , Патриком Нотоном (Patrick Naughton), Крисом Уа ртом (Chris Warth), Эдом Франком (Ed Fran k) и Майком Шериданом (Mike Sheridaп), работав­ шими в компан ии Sun Microsystems, Inc. Разработка первой рабочей версии заняла 18 месяцев. Вначале язык получил название "Oak" (Дуб) , но в 1995 г. он был пере­ именован в 'Java". Между первой реализацией языка Oak в конце 1992 г. и публич­ ным объявлением о создании jаvа весной 1995 г. в разработке и развитии этого языка приняли участие немало других специалистов. В частности , Бил л Джой (Bill Joy) , Артур ван Хофф (Arthur van Hoff) , Джонатан Пэйн (Jonathan Payne ), Франк Йелл ин (Frank Ye llin) и Тим Линдхольм (Тlm Lindholm) внесли основной вклад в развитие исходного прототипа J ava. Как ни странно, первоначальной побудител ьной причиной для создания языка Java послужил совсем не Инте рнет, а потребность в независящем от кон кретной платформы (т.е . архитектурно нейтральном) языке, который можно было бы ис­ пользовать для создания программного обеспечения, встраиваемого в различные быто вые электронные устройства, в том числе микроволновые печи и устройства дистанционного управления. Не трудно догадаться, что в контроллерах таких устройств применяются разнотипные процессоры. Но трудность применения С и С++ (как и большинства других языков) состоит в том, что написанные на них программы должны компилироваться для конкретной платформы. И хотя про-
38 Часть 1. Язык Java граммы на С++ могут быть скомпилированы практически для любого типа про­ цессора, тем не менее, для этого потребуется наличие полного компилятора С++, предназначенного для данного конкретного процессора. Но дело в то м, что соз­ дание компиляторов обходится дорого и отнимает немало времени. Поэтому тре­ бовалось более простое и экономически выгодное решение. Пытаясь найти такое решение, Гос л инг и другие разработчики начали работу над переносимым , не за­ висящим от конкретной платформы языком, который можно было бы использо­ вать для создания кода, пригодного для выполнения на разнотипных процессорах в различных средах. И в ко нечном итоге их усилия привели к создан ию языкаJava. Примерно в то время , когда определялись основные характеристики языка Java, появился второй, еще более важный фактор, который должен был сыграть решающую роль в судьбе этого языка. И этим вторым фактором, конечно же , стала Всемирная паутина (веб). Если бы формирование веб не происходило почти одно­ временно с реализацией языка Java, он мог бы остаться полезным, но незамечен­ ным языком программирования бытовых электронных устройств. Но с появлени­ ем веб языкjаvа вышел на передний край разработки языков программирования, поскольку среда веб также нуждалась в переносимых программах. С самых первых шагов своей карьеры большинству программистов приходится твердо усваивать, что переносимость программ столь же недостижима, сколь и же­ лательна. Несмотря на то что потребность в средствах для создания эффективных, переносимых (не зависящих от конкретной платформы) программ существовала в программировании с самого начала, она отодвигалась на задний план другими, более насущными , задачами. Более того, бмьшая часть отрасли вычислительной техники была разделена на три конкурирующих лагеря (lntel, Macintosh и UNIX), и поэтому большинство программистов оставались на своих закрепленных аппа· ратно-программных рубежах, что несколько снижало потребность в переносимом коде. Те м не менее с появлением Интернета и веб старая проблема переносимости возникла снова, а ее решение стало еще более актуал ьным. Ведь Интернет пред­ ставляет собой разнообразную и распределенную сетевую среду с разнотипными компьютерами, операционными системами и процессорами. Несмотря на то что к Интернету подключены разнотипные платфор мы, пользователям желательно, чтобы на всех этих платформах можно было выполнять одинаковые программы. То , что в начале было неприятной, но не слишком насущной задачей, стало по­ требностью первостепенной важности. К 1993 г. членам группы разработчиков Java стало очевидно, что пробле­ мы переносимости , часто возникающие при создании кода, предназначенного для встраивания в контроллеры, возникают также и при попытках создания кода для Интернета. Фактически та же проблема, для решения которой в мелком мас­ штабе предназначался язык Java, была актуальна в большем масштабе и в среде Интернета. Понимание этого обстоятельства вынудило разработчиков java пере­ нести свое внимание с бьгrовой электроники на программирование для Интернета. Таким образом, Интернет обеспечил крупномасштабный успех Java, несмотря на то , что потребность в архитектурно нейтральном языке программирования по­ служила для этого своего рода "первоначальной искрой". Как упоминалось ранее , языкJava наследует многие изсвоих характеристик от язы­ ков С и С++. Это сделано намеренно. РазработчикиJava знали, что использование зна-
Гл ава 1. Истори я и раз витие язы ка Java 39 комого синтаксиса С и повторение объектно-ориентированных свойств С++ доткно бьmо сделать их язык привлекательным для миллионов, имеющих опыт программи­ рования на С/С++. Помимо внешнего сходства, вjava исполь.зуется ряд других харак­ терных особенностей, которые способствовали успеху языков С и С++. Во-первых, язык jаvа бьm разработан, проверен и усовершенствован людьми, имевшими солид­ ный практический опыт программирования. Этот язык разработан с учетом потреб­ ностей и опыта его создателей. Та ким образом, Java - это язык для программистов. Во-вторых, Java целостен и логически непротиворечив. В-третьих, Java предоставля­ ет программисrу полный контроль над программой, если не учитывать ограничения, накладываемые средой Интернета. Если программирование вьmолняется грамотно, это непосредственно отражается на самих программах. В равной степени справедли­ во и обратное. Иначе говоря, Java - это язык не для обучающихся программирова­ нию, а для тех, кто занимается им профессионально. Из-за сходства характеристик языков Java и С некоторые склонны считать Java просто "версией языка С++ для Интернета". Но это серьезное заблуждение. Языку Java присущи значительные практические и концепrуальные отличия . Язык С++ дей­ ствительно оказал влияние на характеристики jаvа, но Java не является усовершен­ ствован ной версией С++. Например , Java несовместим с языком С++. Разумеется , у него немало сходств с языком С++, и в исходном коде программы нaJava програм­ мирующий на С++ будет чувствовать себя почти как дома. Вместе с тем язык jаvа предназначен не для замены С++, а для решения одних задач , тогда как язык С++ ­ для решения других. Оба этих языка будут еще долго сосуществовать. Как отмечалось в начале гл авы, развитие языков программирования обусловле­ но двумя причинами: адаптацией к изменениям в среде и реализацией новых идей в области программирования. Изменения в среде , которые побудили к разработке языка, подобного Java, вызвали потребность в независящих от платформы про­ гра ммах, предназначенных для распространения в Интернете. Но языкjаvа изме­ няет также подход к написанию программ. В частности , языкjаvа углубил и усовер­ шенствовал объектно-ориентированный подход, использованный в С++, добавил в него поддержку многопоточной обработки и предоставил библиотеку, которая упростила досrуп к Интернету. Но столь поразительный ycпex Java обусловлен не отдел ьными его особенностями , а их совокупностью как языка в целом. Он явил­ ся прекрасным ответом на потребности в то время лишь зарождающейся среды в высшей степени распределенных вычислительных систем. В области разработ­ ки программ для Интернета язык jаvа стал тем, чем язык С стал для системного программирования: революционной силой, которая изменила мир. Связь с языком С# Многообразие и большие возможности языка jаvа продолжают оказывать вли­ яние на всю разработку языков программирования. Многие из его новаторских характеристик, конструкций и концепций становятся неотъемлемой частью осно­ вы любого нового языка. Yc пex java слишком значителен, чтобы его можно бьmо игнорировать. Вероятно, наиболее наглядным примером вл ияния языкаjаvа на программиро­ ва ние служит язы к С#. Он создан в корпорации Microsoft для поддержки платфор-
40 Часть 1. Язы к Java мы .NET Framework и тес но связан с Java. В частности , в обоих этих языках исполь­ зуется од ин и тот же общий синтаксис, поддерживается распределенное програм­ мирование и применяется од на и та же объектная модель. Разумеется, у Java и С# имеется целый ряд отличий, но в целом они внешне очень похожи. Ныне такое "перекрестное опьшение"Java и С# служит наилучшим доказательством того , что языкJаvа коренным образом изменил представление о языках программирования и их применении. Каким образом я зык Java измен ил И нте рнет Интернет способствовал выдвижению Java на передний край программирова­ ния, а языкJаvа, в свою очередь, оказал очень сильное влияние на Интернет. Язык Java не только упростил создание программ для Интернета в целом, но и обусло­ вил появление нового типа прикладных программ, предназначенных для работы в сети и получивших название аплетов, которые изменили понятие содержимого сетевой среды. Кроме того , язык jаvа позволил решить две наиболее острые про­ бл емы программирования , связанные с Интернетом: переносимость и безопас­ ность. Рассмотрим каждую из этих проблем в отдел ьности. Аппеты на Java Аплет - это особый вид прикладной программы на Java, предназначенный для передачи через Интернет и автоматического выполнения в совместимом сJava веб-браузере . Более то го, аплет загружается по требованию, не требуя дальнейше­ го взаимодействия с пользователем. Если пользователь щелкает кнопкой мыши на ссьшке , которая содержит аплет, он автоматически загружается и запускается в браузере. Аплеты создаются в виде небольших программ. Как правило, они слу­ жат для отображения данных, предоставляемых сервером, обработки действий пользователя или выполнения локально, а не на сервере, таких простых функций, как вычисление процентов по кредитам. По существу, аплет позволяет перенести ряд функций со стороны сервера на сторону клиента. Появление аплетов изменило характер программирования приложений для Инте рнета, поскольку они расширили совокупность объектов, которые мож­ но свободно перемещать в киберпространстве . В общем, между сервером и кли­ ентом передаются две крупные категории объектов: пассивные данные и динами­ чески акти визируемые программы. Например, чтение сообщений электронной почты подразумевает просмотр пассивных данных. Даже при загрузке программы ее код по-прежнему остается пассивными дан ными до тех пор, пока он не начнет выполняться . И напротив, аплет представляет собой динамическую , автоматиче­ ски выполняющуюся прикладную программу. Такая программа является акти вным агентом на клиентской машине, хотя она инициируется сервером. Но за привлекательностью динамических сетевых программ скрываются се­ рьезные трудности обеспечения безопасности и переносимости. Очевидно, что клиентскую машину нужно обезопасить от нанесения ей ущерба программой , кото­ рая сначала загружается в нее, а затем автоматически запускается на выполнение.
Гл ава 1. История и развитие язы ка Java ,, Кроме того , такая программа должна быть в состоянии выполняться в различных вычислительных средах и под управлением разных операционных систем. Как станет ясно в дальнейшем, эти трудности эффекти вно и изящно решаются вjava. Рассмотрим их подробнее. Без опас ность Вам , вероятно , известно, что каждая загрузка обычной программы сопряжена с риском, поскольку загружае мый код может содержать вирус, "троянский конь" или вредоносный код. Дело в том, что вредоносный код может сделать свое чер­ ное дело , если получит несанкционированный доступ к системным ресурсам. Например, просматривая содержимое локальной файловой системы компьютера, вирусная программа может собирать конфиденциальную информацию вроде но­ меров кредитных карточек, сведений о состоянии банковских счетов и паролей. Для безопас ной загрузки и выполнения аплетовJava на клиентской машине нужно было предотвратить подобные атаки со стороны аплетов. Java обеспечивает такую за щиту, ограничивая действие аплета исполняющей средой jаvа и не предоставляя ему доступ к другим частям операционной системы компьютера. (Способы достичь этого рассматриваются далее .) Возможность за­ гружать аплеты в полной уверенности , что это не нанесет системе никакого вреда и не нарушит ее безопасность, многие специалисты и пользователи считают наи­ более новаторским аспектом J ava. П ер енос имость Переносимость - основная особенность Инте рнета, поскольку эта гл обальная сеть соединяет вместе множество разнотипных ко мпьютеров и операционных систем. Чтобы программа нa java могла выполняться практически на любом ком­ пьютере, подключенном к Интернету, требуется каким-то образом обеспечить ее выполнение в разных системах. В частности , один и тот же аплет должен иметь возможность загружаться и выполняться на широком спектре процессоров, опе­ рационных систем и браузеров, подключенных к Инте рнету. А создавать разные ве рсии аплетов для разнотипных компьютеров совершенно нерационально. Один и тот же код должен работать на всех компьютерах. Поэтому требовался какой-то механизм для создания переносимого исполняемого кода. Как станет ясно в даль­ не йшем , тот же самый механизм , который обеспечивает безопасность, способ­ ствует и созданию переносимых программ. Чудо Java : байт- код Основная особенность Java , которая позволяет решать описанные выше про­ блемы обеспечения безопасности и переносимости программ, состоит в том , что компилятор Java выдает не исполняемый код , а так называемый ба йт-код - в выс­ шей степени оптимизированный набор инструкций, предназначенных для выпол­ нения в исполняющей системе Java , называемой виртуалъной машиной ]аvа Qava
'2 Часть 1. Язык Java Virtual Machine - JVM). Собственно го воря, первоначальная версия виртуальной машины JVМ разрабатывалась в качестве интерпретатора ба йт-кода. Это может вызывать недоумение, поскольку для обеспечения максимальной производитель­ ности компиляторы многих современных языов программирования призваны создавать исполняемый код. Но то , что программа нajava интерпретируется вир­ туал ьной машинойJVМ , как раз помогает решить основные проблемы разработки программ для Интернета . И вот почему. Тр ансляция программы Java в байт-код значительно упрощает ее выполнение в разноти пных средах, поскольку на каждой платформе необходимо реализовать только виртуальную машину JVМ. Если в отдельной системе имеется исполняю­ щий пакет, в ней можно выполнять любую программу на Java. Следует, однако, иметь в виду, что все виртуальные машины JVМ на разных платформах, несмотря на некоторые отличия и особенности их реализации, способны правильно ин­ терпретировать один и тот же байт-код. Если бы программа нajava ко мпилирова­ лась в машинозависимый код , то для каждого типа процессоров, подключенных к Интернету, должны были бы существовать отдел ьные версии одной и той же программы. Ясно, что такое решение неприемлемо. Та ким образом, организация выполнения байт-кода виртуальной машинойJVМ - простейший способ создания по-настоящему переносимых программ. То т факт, что программа нaJava выполняется виртуальной машиной JVМ, спо­ собствует также повышению ее безопасности . Виртуальная машина JVМ управля­ ет выполнением программы, поэтому она может изолировать программу и воспре­ пятствовать возникновению побочных эффектов от ее выполнения за пределами данной системы. Как станет ясно в дальнейшем, ряд ограничений, существующих в языке jаvа , также способствует повышению безопас ности . В общем, когда программа компилируется в промежуточную форму, а затем ин­ терпретируется виртуальной машинойJVM , она выполняется медленнее, чем если бы она была скомпилирована в исполняемый код. Но в Java это отличие в произ­ водительности не слишком заметно. Байт-код существенно оптимизирован , и по­ этому его применение позволяет виртуальной машинеJVМ выполнять программы значительно быстрее , чем следовало ожидать. Язык Java бьш задуман как интерпретируемый, но ничто не препятствует ему оперативно выполнять компиляцию байт-кода в машинозависимый код для повы­ шения производител ьности. Поэтому вскоре после выпускаjаvа появилась техно­ логия HotSpot, которая предоставляет динамu'Ческuй компилятор (или так называ­ емый рт-компилятор) байт-кода. Если динамический компилятор входит в состав виртуальной машины JVМ , то избранные фрагменты байт-кода компилируются в исполняемый код по частям, в реальном времени и по требованию. Важно по­ нимать, что одновременная компиляция всей программы jаvа в исполняемый код нецелесообразна, посколькуJava производит различные проверки , которые могут быть сделаны только во время выполнения. Вместо этого динамический компи­ лятор ко мпилирует код во время выполнения по мере надобности . Более того , ко мпилируются не все фрагменты байт-кода, а только те , которым компиляция принесет выгоду, а остальной код просто интерпретируется. Те м не менее прин­ цип динамической компиляции обеспечивает значительное повышение произ­ водител ьности . Даже при динамической компиляции байт-кода характеристики
Гл ава 1 . История и развитие яэь1ка Java 'З переносимости и безопасности сохраняются, поскольку вирrуальная машинаJVМ по-прежнему отвечает за целостность исполняющей среды . Сервл еты : серверные программы на Java Как ни полезны аплеты , они решают лишь половину задачи в архитекrуре "клиент-сервер". Вскоре после появления языка jаvа стало очевидно, что он мо­ жет пригодиться и на серверах. В результате появились сервлеты. Сервлст - это небольшая прикладная программа, выполняемая на сервере. Подобно тому как аплеты динамически расширяют фун кциональные возможности веб-браузе ра, сервлеты динамически расширяют функциональные возможности веб-сервера. Та ким образом, с появлением сервлетов язык jаvа охватил обе стороны соедине­ ния "клиент-сервер". Сервлеты служат для создания динамически генерируемого содержимого, ко­ торое затем предоставляется кл иенrу. Например, интерактивный склад может использовать сервлет для поиска стоимости товара в базе данных. Затем инфор­ мация о цене используется для динамического создания веб-страницы, отправля­ емой браузеру. И хотя динамически создаваемое содержимое доступно и с помо­ щью таких механизмов , как CGI (Common Gateway Interface - интерфейс общего шлюза), применение сервлетов дает ряд преимуществ , в том числе повышение производительности. Подобно в сем программам на Java , сервлеты ко мпилируются в байт-код и вы­ полн яются вирrуальной машиной JVМ , поэтому они в высшей степени перено­ симы. Следовательно, один и тот же сервлет может применяться в различных серверных средах. Единственным необходимым усло вием для этого является под­ де ржка на сервере вирrуальной машиныJVM и контейнера для сервлета. Отл и ч ител ьные особенности Java Рассмотрение истории создания и развития языка jаvа было бы неполным без описания особенностей, характерных для Java. Основным фактором, обусловив­ шим изобретение Java, стала потребность в обеспечении переносимости и без­ опасности, но свою роль в формировании окончател ьной верс ии языка сыграли и другие факторы. Гр уппа разработчиков обобщила основные понятия Java и со­ ставила следую щий перечень его особенностей: • простота; • безопасность; • переносимость; • объектная ориентированность; • надежность; • мноrопоточность; • архитекrурная нейтральность;
'' • • • Часть 1. Язы к Java интерпретируемость; высокая производительность; рас п ределенность; • динамичность. Мы уже рассмотрели такие особенности, как безопасность и переносимость. А те перь поясним значение остальных элементов этого списка. П ростота Язык jаvа был задуман как простой в изучении и эффективный в употреблении профессиональными программистами. Овладеть языком Java те м, у кого имеется некоторый опыт программирования , не составит особого труда. Если же вы уже знакомы с основными принципами объектно-ориентированного программирова­ ния, то изуч ить jаvа вам будет еще проще. А от тех, кто имеет опыт программиро­ вания на С++, переход кjava вообще потребует минимум ус илий. Языкjаvа наследу­ ет синтаксис С/С++ и многие объектно-ориентированные свойства С++ , поэтому для большинства программистов изучениеjаvа не составит бол ьших трудностей. О бъектная ориентированность Хотя предшественники языка jаvа и оказали вл ияние на его архитектуру и син­ таксис, при его проектировании не ставилась задача совместимости по исходному коду с каки м-нибудь другим языком. Это позволило группе разработчиков созда­ вать Java, по существу, с чистого листа. Одним из следствий этого явился четкий, практичный, прагматичный подход к объектам. Помимо того , что .! ! Зык jаvа поза­ имствовал свойства многих уд ачных объектно-программных сред, разработанных на протяжении нескольких последних десятилети й, в нем уд алось достичь золотой середины между строгим соблюдением принципа "все элементы программы явля­ ются объектами" и более прагматичного принципа "прочь с дороги". Объектная модель Java проста и легко рас ширяема. В то же время такие элементарные типы данных, как целочисленные, сохраня ются в виде высокопроизводительных ком­ понентов, не являющихся объектами. Н адежность МногоIU1атформенная среда веб предъявляет к программам повышенные тре· бования , поскольку они должны надежно выполняться в разнотипных системах. Поэтому способность создавать надежные программы была одн им из гл авных прио­ ритетов при разработкеjаvа. Для обеспечения надежности вjava накладывается ряд ограничений в нескольких наиболее важных областях, что вынуждает программи­ стов выявлять ошибки на ранних этапах разработки программы. В то же время Java избавляет от необходимости беспокоиться по поводу многих наиболее часто ветре· чающихся ошибок программирования. А поскольку Java - строго типизированный язык, то проверка кода выполняется во время компиляции. Но проверка кода де-
Гл ава 1 . История и раз витие язы ка Java '5 лается и во время выполнения. В результате многие трудно обнаруживаемые про­ граммные ошибки, которые часто приводят к возникновению с трудом воспроизво­ димых ситуаций во время выполнения, попросrу невозможны в программе нa Java. Предсказуемость кода в разных ситуациях - одна из ос новных особенностейJаvа. Чтобы понять, каким образом достигается надежность программ нa Java, рас­ смотрим две основные причины программных сбоев: ошибки управления памя­ тью и неправильная обработка исключений (т.е . ошибки при выполнении) . В тра­ диционных средах создания программ управление памятью - сложная и трудоем­ кая задача. Например, в среде С/С++ программист должен вручную резервировать и освобождать всю динамически распределяемую память. Иногда это ведет к воз­ никновению трудностей, поскольку программисты забывают освободить ранее зарезервированную память или, что еще хуже , пытаются освободить область па­ мяти , все еще используемую другой частью кода. Java полностью исключает такие ситуации, автоматически управляя резервированием и освобожде нием памяти. (Освобождение оперативной памяти полностью выполняется автоматически, по­ скол ькуJava предоставляет средства сборки неиспользуемых объектов в "мусор".) В тради ционных средах условия для исключений часто возникают в таких ситуа­ циях, как делен ие на нуль ил и отсутствие искомого файла, а управление ими долж­ но осуществляться с помощью громоздких и трудных для понимания конструкций. Java облегчает выполнение этой задач и, предлагая объектно-ориентированный механизм обработки исключений. В грамотно написанной программе нajava все ошибки при выполнении могут (и должны) обрабатываться самой программой. Многопоточность Язык Java был разработан в ответ на потребность создавать интерактивные сетевые программы. Для этой цели в Java поддерживается написание много­ поточных программ, способных одновременно выполнять многие действия. Исполняющая система Jаvа содержит изящное, но вместе с тем сложное решение задачи синхронизации многих процессов, которое позволяет строить устойчиво работающие интерактивные системы. Простой подход к организации многопо­ точной обработки , реализованный вJava , позволяет программистам сосредоточи­ вать основное внимание на конкретном поведении программы, а не на создании многозадач ной подсистемы. Арх итектурная н е йтральность Основной задачей , которую ставили перед собой разработчики Jаvа, было обе­ спечение долговечности и переносимости кода. Одной из гл авных трудностей, стоявших перед разработчиками, когда они создавалиJаvа, было отсутствие вся­ ких гаранти й, что код , написанный сегодня, будет ус пешно выполняться завтра - даже на од ном и том же компьютере. Операционные системы и процессоры по­ стоянно совершенствуются, и любые изменения в основных систе мных ресурсах могут стать причиной неработоспособности программ. Пытаясь каким-то образом изменить это положение, разработчики приняли ряд жестких решений в самом языке и виртуальной машине Java. Они поставили перед собой следующую цель:
'6 Часть 1. Язы к Java "написано однажды, выполняется везде , в любое время и всегда". И эта цель была в значительной степени достигнуга. И нтерпретируе мость и в ы сокая произ водител ь ность Как упоминалось ранее , выполняя компиля цию программ в промежуточное представление, называемое байт-кодом, Java позволяет создавать межпла'Iфор­ менные программы. Та кой код может выполняться в любой системе , на которой реализована виртуальная машина JVМ. С первых же попыток разработать меж­ платформенные решения удал ось достичь поставленной цели, хотя и за счет сни­ жения производительности. Как пояснялось ранее, байт-код Java бьт тщательно разработан таким образом, чтобы его можно было с высокой эффективностью преобразовывать непосредственно в машинозависимый код на конкретной плат­ форме с помощью динамического компилятора. Исполняющие системыjаvа, обе­ спечивающие такую возможность, сохраняют все преимущества кода, не завися­ щего от конкретной платформы. Рас предел е нно сть Язык jаvа предназначен для распределенной среды Интернета, поскольку он поддерживает семейство сетевых протоколов ТСР/IP. По существу, обращение к ресурсу по унифицированному указателю информационного ресурса (URL) мало чем отличается от обращения к файлу. В Java поддерживается также удаленнъtй вы­ зов методов (RМI - Re mote Method Invocation ). Та кая возможность позволяет вы­ зывать методы из программ через сеть. Дина мич ность Программы на Java содержат значительный объем данных динамического ти па, используемых для проверки полномочий и разрешения доступа к объек­ там во время выполнения . Это позволяет безопас но и рационально выполнять динамическое связывание кода. Данное обстоятельство исключительно важно для устойчивости среды Java, где небольшие фрагменты байт-кода могут динами­ чески обновляться в действующей системе. Эволюция языка Java Первоначальная версия Java не представляла собой ничего особенно револю­ ционного , но она и не ознаменовала завершение периода быстрого совершенство­ вания этого языка. В отличие от большинства других систем программирования, совершенствование которых происходило понемногу и постепенно, языкjаvа про­ должает стремител ьно развиваться. Вскоре после выпуска версии jаvа 1.0 разра­ ботчики уже создали версиюJava 1.1 . Внедренные в этой версии фун кциональные возможности оказались более значительными и существенными, чем можно бьто ожидать, судя по увеличению дополнительного номера версии. В новой версии
Глава 1.История и развитие языка Java '7 разработчики добавили много новых библиотечных элементов , переопределили механизм обработки событий и изменили конфигурацию многих библиотечных средств из версии 1.0 . Кроме того , они отказались от нескольких средств , перво­ начально определенных в Java 1.0, но признанных затем устаревшими. Таким обра­ зом , в версииjаvа 1.1 были внедрены новые характерные свойства и в то же время исключены некоторые свойства, определенные в первоначальной спецификации. Следующей основной стала версия jаvа 2, где номер "2" означает второе поко­ ление . Создание версии jаvа 2 стало знаменательным событием, означавшим на­ чало "современной эпохи"Java. Первой версииjаvа 2 был присвоен номер 1.2, что может показаться несколько странным. Дело в то м, что вначале номер относил­ ся к внутре ннему номеру версии библиотек Jаvа , но затем он был распространен на всю версию в целом. С появлением версииJаvа 2 компания Sun Microsystems на­ чала выпускать программное обеспечение Java в виде пакета J2SE (Java 2 Platform Standard Edition - Стандартная версия платформыJаvа 2) , и с тех пор номера вер­ сий стали присваиваться именно этому программному продукту. В версии Java 2 была добавлена поддержка ряда новых средств , в том числе Swing и Collections Framework. Кроме того , были усовершенствованы виртуальная ма шина JVМ и различные инструментальные средства программирования . В то же время версия Java 2 содержала некоторые не рекомендованные к употребле­ нию средства. Наибольшие изменения претерпел класс Thread, где методы sus­ pend (), resume () и stop ( ) стали рекомендованными к употреблению в многопо­ точном программировании. Версия J2SE 1.3 стала первой серьезной модернизацией первоначальной вер­ сии Java J2SE. Эта модернизация состояла, гл авным образом, в расширении су­ ществующих фун кциональных возможностей и "уплотнении" среды разработки . В общем случае программы, написанные для версий 1.2 и 1.3, совместимы по ис­ ходному коду. И хотя изменений в версии 1.3 оказалось меньше, чем в трех пред­ шествующих основных версиях, это не сделало ее менее важной. Совершенствование языка Java было продолжено в версии J2SE 1.4 . Эта вер­ сия содержала несколько важных усовершенствований и добавлений. Например, в нее были добавлены новое ключевое слово assert, цепочки исключений и под­ система ввода-вывода на основе ка налов. Изменения были внесены и в каркас Collections Framework, а также в классы, предназначенные для работы в сети . В эту ве рсию было также внесено много мелких изменений. Несмотря на значительное количество новых функциональных возможностей, версия 1.4 почти полностью сохранила совместимость по исходному коду с предшествующими ве рсиями. В следующую версию Java, названную J2SE 5, был внесен ряд революционных изменений. В отличие от большинства предшествующих обновлений Java, кото­ рые предоставляли важные, но постепенные ус овершенствования, в версииJ2SЕ 5 была коренным образом расширена область, возможности и пределы применения языка. Чтобы стало понятнее, насколько существенными оказались изменения , внес енные в версии J2SE 5, ниже перечислены лишь самые основные из новых функциональных возможностейJаvа в данной версии. • Обобщения. • Аннотации.
48 Часть 1. Язык Java • Автоупаковка и автораспаковка. • Перечисления. • Ус овершенствован ный цикл for в стиле f or each. • Аргументы переменной длины (varargs). • Стати ческий импорт. • Форматированный ввод-вывод. • Ут илиты параллел ьной обработки . В этом перечне не указаны незначительные изменения или постепенные усо­ вершенствования. Каждый пункт перечня представлял значительное дополнение языка jаvа. Одни из них, в том числе обобщения , усовершенствованный цикл for и аргументы переменной длины, представляли новые синтаксические эл ементы , а друrие, например автоупаковка и автораспаковка, изменяли семантику языка. Аннотации придали программированию совершенно новые черты . В любом слу­ чае влияние всех этих дополнений вышло за рамки их прямого действия. Они пол­ ностью изменили сам характер языка jаvа. Значение новых фун кциональных возможностей нашло отражение в присвоен­ ном данной версии номере - "5". Если следовать привычной логике, то следующим номером версииjаvа должен был быть 1.5 . Однако новые средства оказались столь значительными, что переход от версии 1.4 к ве рсии 1.5 не отражал бы масштабы внесенных изменений. Поэтому в компан ии Sun Microsystems решили присвоить новой версии номер 5, чтобы тем самым подчеркнуть значимость этого события . Поэтому версия данного программного продукта была названаJ2SЕ 5, а комплект разработчика - JDK 5. Те м не менее для сохранения единообразия в ко мпании Sun Microsystems решили использовать номер 1.5 в качестве внутреннего номера версии, называемого также номером версии разработки. Цифра 5 в обозначении версии называется номером версии продукта. Следующая версия получила название Java SE 6. С выходом этой версии в ком­ пании Sun Microsystems решили в очередной раз изменить название платформы Java. В названии была опущена цифра 2. Та ким образом, данная платформа те перь называется сокращенно ja va SE, а официально - Ja va Platfarm , Standaтd Edition 6 (ПлатформаJаvа, стандартная версия 6) . Комплект разработчика был названJDК 6. Как и в обозначении версии J2SЕ 5, цифра 6 в названии jаvа SE 6 означает номер верс ии продукта. Внутренним номером разработки этой версии является 1.6. Версия jаvа SE 6 была построена на основе версии J2SЕ 5 с рядом дальнейших усовершенствований. Она не содержала дополнений к числу основных языковых средств Java, но расширяла библиотеки API, добавляя несколько новых пакетов и предоставляя ряд усовершенствований в исполняющей системе . В этой версии было сделано еще несколько усовершенствован ий и внесено несколько дополне­ ний. В целом версия Java SE 6 призвана закрепить достижения в J2SE 5. Далее был а выпущена версия Jаvа SE 7 с комплектом разработчика Jаvа JDК 7 и внутренним номером версии 1.7. Это был первый гл авный выпускjаvа с тех пор, как компания Sun Microsystems была приобретена ко мпанией Oracle (этот процесс начался в апреле 2009 года и завершился в январе 2010 года) . Версия jаvа SE 7 со-
Глава 1 . История и развитие языка Java 1.9 держит много новых средств , включая существенные дополнения языка и библи­ отек Java API. В данной версии была усовершенствована исполняющая система Java, а также включена в нее помержка других языков, кроме Java, но програм­ мирующих нajava больше интересовали дополнения , внесенные в сам язык и его библиотеку. Новые языковые средства были разработаны в рамках проекта Pro:ject Coin. Этот проект должен был обозначать многие, так называемые "мелкие" из­ менения вjava, которые предполагалось включить вJDK 7, хотя эффект от всех этих новых "мелких" новшеств весьма вел ик с точки зрения их воздействия на код. В действительности для большинства программистов эти изменения могут стать самым важным нововведением в Java SE 7. Ниже перечислены новые языковые средства, внедренные вJDK 7. • Расширение типа String возможностями управлять ветвлением в операто- ре switch. • Двоичные целочисленные литерал ы. • Символы подчеркивания в числовых литералах. • Расширение оператора try, называемое оператором try с ресурсами, обеспечи­ вающим автоматическое управление ресурсами. (Например, потоки ввода-вы­ вода моrуг теперь быть закрьrгы автоматически, когда они больше не нужны .) • Выводимость типов (с помощью ромбовидного оператора <>) при создании обобщенного экземпляра. • Ул учшенная обработка исключений, благодаря которой два исключения или больше могут быть обработаны в одном блоке оператора catch (много­ кратный перехват) , а также улучшенный контроль соответствия типов по­ вторно ге нерируемых исключений. • Ул учшение предупреждений компилятора, связанных с некоторыми типами методов с переменным количеством аргументов. И хотя это нельзя считать из­ менением в синтаксисе, оно дает бальший контроль над предупреждениями. Несмотря на то что средства, внедренные в рамках проекта Project Coin, счи­ таются мелкими изменениями в языке Java, в целом они тем не менее дают мно­ го больше преимуществ, чем подразумевает само понятие "мелкие". В частности , оператор try с ресурсами оказывает существенное влия ние на порядок написания кода, опирающегося на потоки ввода-вывода. Кроме того , возможность использо­ вать объекты типа String в операторе switch оказалась долгожданным усовер­ шенствованием, позволившим во многом упростить код. В версии Java SE 7 внесено несколько дополнений в библиотеку Java API. Важнейшими из них являются усовершенствования каркаса NIO Framework и до­ полнения каркаса Fork/Join Framework. Новая система ввода-вывода NIO (перво­ начально называвшаяся New !/ О) была внедрена в версии jаvа 1.4 . Но изменения, внесенные в версии jаvа SE 7, значительно расширили возможности этой систе­ мы, причем настолько, что она зачастую обозначается как N/0.2 . Каркас Fork/Join Framework обеспечивает важную помержку парал л ельного программирования. Те рмином пара.мелъное програм м ир ование обычно обозначают­ ся технологии, повышающие эффекти вность применения компьютеров с несколь-
50 Часть 1. Яэwк Java кими процессорами, вклJОЧаа многоядерные системы. Преимуще ства, которые д�uот ._ногоядернwе системы , поаволяют в перспективе значительно повысить nро�заодительнqст�. nрогрЮfи, Каркас Fork/Join Framework п озволяет решать эа• дачи парал л ельно1V, nрогрвм;vирования в следующих областях: • упрощение сdсtаВ:Лейня й использования заданий, которые мо �уг выпоЛ� пяться пара.iше.пi.нQ; . · 1 - t"t • автоматw.Jес�ое цспол�цание нескольких процессоров. ' Следовательно , с ndмdIЦЬid каркаса Fork/Join Frarnework можно создавать при­ ЛОЖения, в кoтOpr.tk авtоматИЧесtси используются процессоры , досТупнЫ:е ' в ис­ полняющей среде. Разумеется, не все алгоритмы оказываются парал л ельными, но � JJЭНIP', которъ�е т,щц>вым:и все же ЯВJLЯются , позволяют добиться существенных преимуществ в скорости выполнения � Версия Java SE 8 -' (� В новейщеw ;выпуске ,Р. .п St:,,8 с 1юмплектом разработчикаJ DК 8 и внугренним щ>иером версщ�, ЦJ. , ,nроц:ющли значительн ые усовершенствования бл;агодаря внедрению лямбд.а-в ыражений - нового языкового средства с далеко Идущft:М по- 1•'·_. - - :_. ' .- . ' .;·-� ·' . �- '.'.- '1. ,. - . . 1 " сл'еДСтвиЯми'. Лямбда-вьiражения позволяют совершенно иначе подходить к про- граммированию и написанию кода. Как поясняется более п одробно в главе 15, ймб,ца·выражений внm:ят вJava возможности функционального проrраммир0ва­ RИ•; · В процессе nр0гра)�(М4'рОоаНЮ1 .1 1Я мбда·выражен ия способны упрости1Ъ и со­ кратить объем иоrодного tto.l(a; требующегося для создания определенных. кон­ струкций, в том числе некоторых типов анонимных классов. Кроме того , лямбда­ JJ�ения вводм:'J' » язы� Jlовый оператор (->) и эле мецт си нтакс иса. И наконец, JЦибда-аwр4'Же1ЩЯ по�rа�т . сщr.ранить живость и проворство язьпщ, которые ПОJlЬЗОвате.ли У?К�Ч� � "�JWоlо( .О�ТЬ от Java. Внедрение лямбда-выражений оказало обширное вл ияние и на библиотекиJava, кЬторые бы.iJи дdrЮлнёюJ йЬisЬtми ·средствами , выгодно испол ьзующими лямбда­ в'бiраженИя. к наиболее is� новшествам в библиотеке Jаvа относится новый npit:iuiМitoй hpc>ti(ja:Ммнili* mtri!pфeйc API потоков ввода-вывода, входящий в па" к�'j ava . uti1 . st re;am; 'B1Эroм' rфi'fRmi д нoм инrерфейсе API, оптимизированном с'учетом лямбда..tьфЗ.ЖенИй, поддерживаются конвейерные операции с данным'и . lще одним ваЖнЬlм новiП�с'thЬм является пакет j ava . util . function, в котором определен целый ряд фун:кЦiаmал:ьнъtх интерфейсов, обеспечивающих дополниrе.Jiь­ нУю поддержtсу ·лямбда-1\ьt�ажёний. В библиотеке Java API внедрены и другие , ме- нее значительные cpe�t'ri ia ; liмеЮщие отношение к лямбда-выражениям. . ·' 'Еще одiю нqвовведе�е; на�ЙннЬе лямбда-выражениями, касается интерфейсов. В Вер<:·ии .JDK 8 h:оявRла(:ь !iозможно'стЬ определять реализацию по умолчанию метО-: да; объяв.Jiенноrо в'��Йtе; Если конкретная реализация такого меТода отсут­ ствует, то используеТся eroрёаЛизация по умолчанию в интерфейсе. Таки м образрм, Обесnечиваетс:я поdеrtенн0е развитие интерфейсов , поскольку новый метод может бЬlть в�ден в инtеj>фейс, Н'е ii:apymaя существующий " код. Это новшество позволЯ-
Гл ава 1.История и развитие языка Java 51 ет также рационализировать реализацию интерфейса при наличии подходящих средств, доступных по умолчанию. К числу других средств, появившихся в JDK 8, от­ носятся новый прикладной программный интерфейс API для обработки даты и вре­ мени, типовые аннотации и возможность использовать парал л ельную обработку при сортировке массива. Кроме того, в составJDK 8 включена поддержкаJavaFX 8 - последней версии нового каркаса приложенийJаvа с ГПИ. Предполагается, что кap­ кac JavaFX станет неотъемлемой частью практически всех приложений jаvа и в к<r печном итоге заменит Swing для разработки большинства проектов на основе ГПИ. Введение вjavaFX представлено в части IV данной книги. Подводя краткий итог, можно сказать, чтоJava SE 8 является основной верси­ ей , значительно расширяющей возможности Java и изменяющей порядок написа­ ния кода на этом языке. Последствия выпуска этой версии еще долго будуг оказы­ вать вл ияние на все области применения Jаvа. И это действительно очень важное обновление Java. Материал настоящего издания был обновлен таким образом, чтобы отражать переход к версииjаvа SE 8 со всеми новыми средствами, модификациями и допол­ нениями, обозначенными в соответствующих местах книги. Культура нововведений С самого начала язык Java оказался в центре культуры нововведений. Его первоначальная версия изменила подход к программированию для Интернета. Виртуальная маш ина Java (JVМ) и байт-код совершенно изменили представление о безопасности и переносимости. Аплеты (а вслед за ними и сервлеты) вдохнули жизнь в веб. Процесс Java Community Process ОСР) изменил способ внедрения н<r вых идей в язык. Область применения Java никогда не оставалась без изменений в течение длительного периода времени. И Java SE 8 остается на момент выхода этого издания из печати самой последней версией в непрекращающемся динамич­ ном развитииJаvа.
2 Краткий обзор Java Как и во всех остальных языках программирования, элементы Java существуют не сами посебе. Они скорее действуют совместно, образуя язык в целом. Но такая их вза­ имосвязанность может затруднять описание какоГОJ J'О одного аспекта jаvа, не затра­ гивая ряда других. Зачастую для понимания одного языкового средства необходимо знать другое средство. Поэтому в этой гл аве предста ал ен краткий обзор ряда основ­ ных языковых средств Java. Приведенный в ней материал послужит отправной точ­ кой, •rгобы создавать и понимать простые проrраммы. Большинство рассмотренных в этой гл аве вопросов будуг подробнее обсуждаться в остальных гл авах данной части. Объектн о-ор иенти р ованное прогр аммирование Объектно-ориентированное программирование (ООП) составляет основу Java. По существу, все программы на Java являются в какой-то степени объектно­ ориентированными. Язык Java связан с ООП настолько тес но , что прежде чем приступить к написанию на нем даже простейших программ, следует вначале оз­ накомиться с основными принципами ООП. Поэтому начнем с расс мотрения тео­ ретических вопросов ООП. Две м етодики Все компьютерные программы состоят из двух элементов: кода и данных. Более того, программа концептуально может быть организована вокруг своего кода или своих данных. Иными словами , организация одних программ определяется те м, "что происходит" , а других - те м, "на что оказывается вл ияние''. Существуют две методи ки создания программ. Первая из них называется моделъю, ориентированной. на nр О'Цессы и характеризует программу как последовательность линейных шагов (т.е . кода). Модель, ориентированную на процессы, можно рассматривать в каче­ стве кода, воздействующего на данные. Та кая модель довольно успешно применяется в про цедур ных языках вроде С. Но, как отмечалось в гл аве 1, подобный подход по­ рождает ряд трудностей в связи с увеличением размеров и сложности программ. С целью преодолеть увеличение сложности программ бьша начата разработ­ ка подхода, называемого об'6е/Сm1ю-ариентированным програм м ир ованием. Объектно­ ориентированное программирование позволяет организовать программу вокруг
5' Часть 1. Язы к Java ее данных (т.е. объектов) и набора вполне определенных интерфейсов с этими да нными. Объектно�риентированную программу можно охарактеризовать как даннш, управляющие доступам к коi!у. Как будет показано далее, передавая функции управления данными, можно получить несколько организационных преимуществ. Абстракция Важным элементом ООП является абстракция. Человеку свойственно представ­ лять сложные явления и объекты, прибегая к абстракции. Например, люди пред­ ставляют себе автомобиль не в виде набора десятков тысяч отдельных деталей, а в виде совершенно определенного объекта, имеющего свое особое поведение. Эта абстракция позволяет не задумываться о сложности деталей , составляющих автомобиль, скажем, при поездке в магазин. Можно не обращать внимания на под­ робности работы двигателя, коробки передач и тормозной системы. Вместо этого объект можно использовать как единое целое. Эффективным средством применения абстракции служат иерархические клас­ сификации. Это позволяет упрощать семантику сложных систем , разбивая их на более управляемые части . Внешне автомобиль выглядит единым объектом. Но стоит заглянуть внутрь, как становится ясно, что он состоит из нескольких под­ систем: рулевого управления, тормозов, аудиосистемы, привязных ремней, обо­ гревателя , навигатора и т. п. Каждая из этих подсистем, в свою очередь, собрана из более специализированных узлов. Например, аудиосистема состоит из радиопри­ емника, проигрывателя компакт-дисков и/или аудиокассет. Суть всего сказанного состоит в том, что структуру автомобиля (или любой другой сложной системы) можно описать с помощью иерархических абстракций. Иерархические абстракции сложных систем можно применять и к компьютер­ ным программам. Благодаря абстракции данные традиционной , ориентирован­ ной на процессы, программы можно преобразовать в составляющие ее объекты, а последовательность этапов процесса - в совокупность сообщений, передавае­ мых между этими объектами. Та ким образом, каждый из этих объектов описывает свое особое поведение. Эти объекты можно считать ко нкретными сущностями, реагирующими на сообщения , предписывающие им въtnал.нитъ конкретное действие. В этом, собственно, и состоит вся суть ООП. Принципы ООП лежат как в основе языкаJava, так и восприятия мира человеком. Важно понимать, каким образом эти принципы реализуются в програм мах . Какстанет ясно в дальнейшем, ООП является еще одной, но более эффективной и естественной методикой создания программ, способных пережить неизбежные изменения, сопро­ вождающие жизненный цикл любого крупного программного проекта, включая за­ рождение общего замысла, развитие и созревание. Например, при наличии тщатель­ но определенных объектов и ясных, надежных интерфейсов с этими объектам можно безбоязненно и без особого труда извлекать или заменять части старой системы. Три принци па ООП Все языки объектн�риентированного программирования предоставляют ме­ ханизмы, облегчающие реализацию объектн�риентированной модели. Этими
Гл ава 2. Краткий обзор Java 55 механ измами являются инкапсуля ция, наследование и полиморфизм . Рассмотрим эти принципы ООП в отдел ьности . Инкапсуляция Механ изм , связывающий код и данные, которыми он манипулирует, защищая оба эти компонента от внешнего вмешательства и злоупотреблений, называется июсап­ суля цшй. Инкапсуляцию можно считать защитной оболочкой , которая предохраня­ ет код и дан ные от произвольного досrупа со стороны другого кода, находящегося снаружи оболочки . Доступ к коду и данным, находящимся внутри оболочки , строго контролируется тщател ьно определенным интерфейсом. Чтобы провести анало­ гию с реальным миром, рассмотрим автоматическую коробку передач автомобиля. Она инкапсулирует немало сведений об автомобиле, в том числе величину ускоре­ ния , крутизну поверхности , по которой совершается движение, а также положение рычага переключения скоростей. Пользователь (в данном случае водитель) может оказывать вл ияние на эту сложную инкапсуляцию только одним способом: переме­ щая рычаг переключения скоростей. На коробку передач нельзя воздействовать, например, с помощью индикатора поворота или дворников. Та ким образом, рычаг переключения скоростей является строго определенным, а по существу, единствен­ ным, инте рфейсом с коробкой передач. Более то го , происходящее внутри коробки передач не влияет на объекты, находящиеся вне ее. Например , переключение пере­ дач не включает фары! Функция автоматического переключения передач инкапсу­ лирована, и поэтому десятки изготовителей автомобилей могут реализовать ее как угодно. Но с точки зрения водителя все эти коробки передач работают одинаково. Аналогичный принцип можно применять и в программировании. Сильная сторона инкапсулированного кода состоит в следующем: всем известно, как получить доступ к нему, а следовательно , его можно ис пользовать независимо о подробностей реали­ зации и не опасаясь неожиданных побочных эффектов. Основу инкапсуляции вJava составляет класс. Подробнее класс ы будут рассмотре­ ны в последующих гл авах, а до тех пор полезно дать хотя бы краткое их описание. Класс определяет структуру и поведение (данные и код), которые будут совместно использоваться набором объектов. Каждый объект данного класса содержит струк­ туру и поведение, которые определены классом, как если бы объект был "отлит" в форме класса. Поэтому иногда объекты называют экземпляра.ми 'К.!Lасса. Та ким об­ разом, класс - это логическая конструкция , а объект - ее физическое воплощение. При создан ии класса определяются код и данные, которые образуют этот класс . Совместно эти элементы называются 11ЛСНа.ми класса. В частности , определенные в классе данные называются пере.мт т ъtмwч.ле н а.ми, или пере.штнъtми экземпляра, а код, оперирующий данными, - методами-"1ЛСНа.ми, или просто методами. (То, что програм­ мирующие нa Java называют методами, программирующие на С/С++ называют tfrунк­ циями.) В программах, правильно написанных наJava, методы определяют, каким об­ разом используются переменные-члены. Это означает, что поведение и интерфейс класса определяются методами , оперирующими данными его экземпляра. Поскольку назначение класса состоит в инкапсул яции сложной структуры про­ граммы, существуют механизмы сокрытия сложной структуры реализации в самом классе. Каждый метод или переменная в классе могут быть помечены как закрытые или открытые. Откръtтъtй интерфейс класса представляет все, что должны ил и мо-
56 Часть 1. ЯзыкJava гут знать внешние пользователи класса. Закрытъtе методы и данные могут быть до­ ступны только для кода, который является членом данного класса. Следовательно, любой другой код, не являющийся членом данного класса, не может получать доступ к закрытому методу или переменной. Закрытые члены класса доступны другим ча­ стям программы только через открытые методы класса, и благодаря этому исключа­ ется возможность выполнения неправомерных действий. Это , ко нечно, означает, что открытый интерфейс должен быть тщательно спроектирован и не должен рас­ крывать лишние подробности внугреннего механизма работы класса (рис 2. 1). о Открытые переменные экземпляра (не рекомендуются) L� Открытые методы Закрытые методы Закрытые переменные экземпляра Класс \/д / д д А� L.1о оо Рис. 2.1 . Инкапсуляция: открытые методы можно использовать дл я защиты закрытых да нных Наследование Процесс, в результате которого один объект получает свойства другого, назы­ вается нас:ледованием. Это очень важный принцип ООП, поскольку наследование обеспечивает принцип иерархической классификации. Как отмечалось ранее, большинство знаний становятся доступными для ус воения благодаря иерархиче­ ской (т.е. нисходящей) классификации. Например, золотистый ретривер - часть классификации собак, которая , в свою очередь, относится к классу .млекопитающих, а тот - к еще большему классу животнъtх. Без иерархий каждый объект должен был бы явно определять все свои характеристики. Но благодаря наследованию объект должен определять только те из них, которые делают его особым в классе. Объект может наследовать общие атрибуты от своего родительского объекта. Та ким об-
Гл ава 2. Краткий обзор Java 57 разом, механизм наследования позволяет