Содержание

Предисловие .............................................................................................................25
Java SE5 и SE6 ..................................................................................................................................26
Java SE6...............................................................................................................................................27
Четвертое издание...........................................................................................................................27
Изменения..........................................................................................................................................27
Замечания о дизайне обложки....................................................................................................29
Благодарности ..................................................................................................................................29
Введение ...................................................................................................................33
Предпосылки.....................................................................................................................................34
Изучение Java ...................................................................................................................................34
Цели......................................................................................................................................................35
Обучение по материалам книги .................................................................................................36
HTML-документация JDK...........................................................................................................36
Упражнения.......................................................................................................................................37
Сопроводительные материалы ...................................................................................................37
Исходные тексты программ.........................................................................................................38
Стандарты оформления кода...................................................................................................39
Ошибки...............................................................................................................................................39
Глава 1. Введение в объекты...................................................................................40
Развитие абстракции......................................................................................................................41
Объект обладает интерфейсом ...................................................................................................43
Объект предоставляет услуги .....................................................................................................45
Скрытая реализация.......................................................................................................................46
Повторное использование реализации....................................................................................47
Наследование....................................................................................................................................48
Отношение «является» в сравнении с «похоже»..............................................................51
Взаимозаменяемые объекты и полиморфизм .......................................................................52
8 Содержание
Однокорневая иерархия................................................................................................................55
Контейнеры .......................................................................................................................................56
Параметризованные типы ............................................................................................................57
Создание и время жизни объектов............................................................................................58
Обработка исключений: борьба с ошибками.........................................................................60
Параллельное выполнение...........................................................................................................61
Java и Интернет................................................................................................................................62
Что такое Web? .............................................................................................................................62
Вычисления «клиент—сервер».............................................................................................62
Web как гигантский сервер ....................................................................................................63
Программирование на стороне клиента ..............................................................................63
Модули расширения ................................................................................................................64
Языки сценариев .......................................................................................................................65
Java..................................................................................................................................................66
Альтернативы..............................................................................................................................66
.NET и C#.....................................................................................................................................67
Интернет и интрасети..............................................................................................................67
Программирование на стороне сервера ...............................................................................68
Резюме.................................................................................................................................................69
Глава 2. Все является объектом ..............................................................................70
Для работы с объектами используются ссылки....................................................................70
Все объекты должны создаваться явно....................................................................................71
Где хранятся данные ...................................................................................................................72
Особый случай: примитивные типы.....................................................................................73
Числа повышенной точности................................................................................................74
Массивы в Java .............................................................................................................................74
Объекты никогда не приходится удалять...............................................................................75
Ограничение области действия ..............................................................................................75
Область действия объектов......................................................................................................76
Создание новых типов данных ...................................................................................................76
Поля и методы ..............................................................................................................................77
Значения по умолчанию для полей примитивных типов...........................................78
Методы, аргументы и возвращаемые значения ....................................................................78
Список аргументов......................................................................................................................79
Создание программы на Java.......................................................................................................80
Видимость имен ...........................................................................................................................80
Использование внешних компонентов ................................................................................81
Ключевое слово static.....................................................................................................................82
Ваша первая программа на Java..................................................................................................83
Компиляция и выполнение......................................................................................................85
Комментарии и встроенная документация ............................................................................87
Документация в комментариях ..............................................................................................87
Синтаксис.......................................................................................................................................88
Встроенный HTML.....................................................................................................................88
Примеры тегов..............................................................................................................................89
@see: ссылка на другие классы..............................................................................................89
Содержание  9
{@link пакет.класс#член_класса метка}............................................................................89
{@docRoot}...................................................................................................................................90
{@inheritDoc} ..............................................................................................................................90
@version ........................................................................................................................................90
@author..........................................................................................................................................90
@since.............................................................................................................................................90
@param...........................................................................................................................................90
@return ..........................................................................................................................................90
@throws.........................................................................................................................................91
@deprecated..................................................................................................................................91
Пример документации...............................................................................................................91
Стиль оформления программ .....................................................................................................92
Резюме.................................................................................................................................................92
Упражнения.......................................................................................................................................93
Глава 3. Операторы ..................................................................................................95
Простые команды печати..............................................................................................................95
Операторы Java ................................................................................................................................96
Приоритет.......................................................................................................................................96
Присваивание................................................................................................................................97
Совмещение имен во время вызова методов ...................................................................98
Математические операторы.....................................................................................................99
Унарные операторы плюс и минус...................................................................................... 101
Автоувеличение и автоуменьшение................................................................................... 101
Операторы сравнения ............................................................................................................. 103
Проверка объектов на равенство ...................................................................................... 103
Логические операторы............................................................................................................ 104
Ускоренное вычисление....................................................................................................... 105
Литералы......................................................................................................................................... 106
Экспоненциальная запись ..................................................................................................... 108
Поразрядные операторы ........................................................................................................ 109
Операторы сдвига..................................................................................................................... 110
Тернарный оператор ................................................................................................................ 113
Операторы + и += для String................................................................................................ 114
Типичные ошибки при использовании операторов...................................................... 115
Операторы приведения........................................................................................................... 116
Округление и усечение........................................................................................................... 117
Повышение............................................................................................................................... 118
В Java отсутствует sizeof............................................................................................................. 118
Сводка операторов ................................................................................................................... 118
Резюме.............................................................................................................................................. 126
Глава 4. Управляющие конструкции.................................................................... 127
true и false..................................................................................................................................... 127
if-else .............................................................................................................................................. 127
Циклы ........................................................................................................................................... 128
10 Содержание
do-while......................................................................................................................................... 129
for.................................................................................................................................................... 129
Оператор-запятая ..................................................................................................................... 131
Синтаксис foreach......................................................................................................................... 131
return................................................................................................................................................. 133
break и continue ............................................................................................................................. 134
Нехорошая команда goto ........................................................................................................... 136
switch............................................................................................................................................. 140
Резюме.............................................................................................................................................. 142
Глава 5. Инициализация и завершение............................................................... 143
Конструктор гарантирует инициализацию......................................................................... 143
Перегрузка методов ..................................................................................................................... 145
Различение перегруженных методов................................................................................. 147
Перегрузка с примитивами ................................................................................................... 148
Перегрузка по возвращаемым значениям........................................................................ 151
Конструкторы по умолчанию............................................................................................... 152
Ключевое слово this................................................................................................................. 153
Вызов конструкторов из конструкторов .......................................................................... 155
Значение ключевого слова static ......................................................................................... 156
Очистка: финализация и уборка мусора .............................................................................. 157
Для чего нужен метод finalize()? ......................................................................................... 158
Очистка — ваш долг ................................................................................................................. 159
Условие «готовности» ............................................................................................................. 159
Как работает уборщик мусора.............................................................................................. 161
Инициализация членов класса ................................................................................................ 164
Явная инициализация............................................................................................................. 165
Инициализация конструктором.............................................................................................. 167
Порядок инициализации........................................................................................................ 167
Инициализация статических данных................................................................................ 168
Явная инициализация статических членов..................................................................... 171
Инициализация нестатических данных экземпляра ................................................. 172
Инициализация массивов ......................................................................................................... 173
Списки аргументов переменной длины............................................................................ 177
Перечисления ................................................................................................................................ 182
Резюме.............................................................................................................................................. 184
Глава 6. Управление доступом ............................................................................. 186
Пакет как библиотечный модуль............................................................................................ 187
Структура кода .......................................................................................................................... 188
Создание уникальных имен пакетов.................................................................................. 190
Конфликты имен.................................................................................................................... 192
Пользовательские библиотеки............................................................................................. 193
Использование импортирования для изменения поведения.................................... 194
Предостережение при работе с пакетами......................................................................... 195
Спецификаторы доступа Java .................................................................................................. 195
Содержание  11
Доступ в пределах пакета....................................................................................................... 195
public.............................................................................................................................................. 196
Пакет по умолчанию ............................................................................................................. 197
private............................................................................................................................................ 197
protected ....................................................................................................................................... 198
Интерфейс и реализация ........................................................................................................... 200
Доступ к классам .......................................................................................................................... 201
Резюме.............................................................................................................................................. 205
Глава 7. Повторное использование классов........................................................ 206
Синтаксис композиции .............................................................................................................. 206
Синтаксис наследования ........................................................................................................... 209
Инициализация базового класса......................................................................................... 211
Конструкторы с аргументами ............................................................................................ 212
Делегирование............................................................................................................................... 214
Сочетание композиции и наследования............................................................................... 215
Обеспечение правильного завершения............................................................................. 217
Сокрытие имен .......................................................................................................................... 220
Композиция в сравнении с наследованием......................................................................... 221
protected........................................................................................................................................... 222
Восходящее преобразование типов........................................................................................ 224
Почему «восходящее преобразование»? .......................................................................... 224
Снова о композиции с наследованием............................................................................ 225
Ключевое слово final.................................................................................................................... 226
Неизменные данные ................................................................................................................ 226
Пустые константы.................................................................................................................. 228
Неизменные аргументы ....................................................................................................... 229
Неизменные методы ................................................................................................................ 229
Спецификаторы final и private........................................................................................... 230
Неизменные классы................................................................................................................. 231
Предостережение ...................................................................................................................... 232
Инициализация и загрузка классов....................................................................................... 233
Инициализация с наследованием....................................................................................... 234
Резюме.............................................................................................................................................. 235
Глава 8. Полиморфизм.......................................................................................... 237
Снова о восходящем преобразовании ................................................................................... 238
Потеря типа объекта ................................................................................................................ 239
Особенности................................................................................................................................... 240
Связывание «метод-вызов»................................................................................................... 240
Получение нужного результата ........................................................................................... 241
Расширяемость .......................................................................................................................... 244
Проблема: «переопределение» закрытых методов........................................................ 247
Проблема: поля и статические методы.............................................................................. 248
Конструкторы и полиморфизм................................................................................................ 249
Порядок вызова конструкторов........................................................................................... 249
12 Содержание
Наследование и завершающие действия.......................................................................... 251
Поведение полиморфных методов при вызове из конструкторов .......................... 256
Ковариантность возвращаемых типов .................................................................................. 258
Наследование при проектировании....................................................................................... 259
Нисходящее преобразование и динамическое определение типов......................... 260
Резюме.............................................................................................................................................. 261
Глава 9. Интерфейсы............................................................................................. 263
Абстрактные классы и методы................................................................................................. 263
Интерфейсы ................................................................................................................................... 266
Отделение интерфейса от реализации.................................................................................. 270
«Множественное наследование» в Java................................................................................ 274
Расширение интерфейса через наследование..................................................................... 276
Конфликты имен при совмещении интерфейсов.......................................................... 278
Интерфейсы как средство адаптации.................................................................................... 279
Поля в интерфейсах................................................................................................................. 281
Инициализация полей интерфейсов ................................................................................. 281
Вложенные интерфейсы ............................................................................................................ 282
Интерфейсы и фабрики ............................................................................................................. 285
Резюме.............................................................................................................................................. 287
Глава 10. Внутренние классы ............................................................................... 288
Создание внутренних классов ................................................................................................. 288
Ссылка на внешний класс...................................................................................................... 290
.this и .new ....................................................................................................................................... 292
Внутренние классы и восходящее преобразование.......................................................... 293
Внутренние классы в методах и областях действия......................................................... 295
Анонимные внутренние классы .............................................................................................. 297
Снова о паттерне «Фабричный метод»................................................................................. 301
Вложенные классы....................................................................................................................... 303
Классы внутри интерфейсов................................................................................................. 305
Доступ вовне из многократно вложенных классов....................................................... 306
Внутренние классы: зачем?....................................................................................................... 306
Замыкания и обратные вызовы ........................................................................................... 309
Внутренние классы и система управления...................................................................... 311
Наследование от внутренних классов................................................................................... 317
Можно ли переопределить внутренний класс? ................................................................. 318
Локальные внутренние классы............................................................................................ 319
Идентификаторы внутренних классов ............................................................................. 321
Резюме.............................................................................................................................................. 322
Глава 11. Коллекции объектов............................................................................. 323
Обобщенные типы и классы, безопасные по отношению к типам.............................. 324
Основные концепции.................................................................................................................. 327
Добавление групп элементов ................................................................................................... 329
Вывод контейнеров .................................................................................................................. 330
Содержание  13
List...................................................................................................................................................... 333
Итераторы....................................................................................................................................... 336
ListIterator................................................................................................................................... 339
LinkedList ....................................................................................................................................... 340
Стек ................................................................................................................................................... 341
Множество ...................................................................................................................................... 343
Map .................................................................................................................................................... 346
Очередь ............................................................................................................................................ 350
PriorityQueue ................................................................................................................................. 351
Collection и Iterator ..................................................................................................................... 353
Foreach и итераторы .................................................................................................................... 356
Идиома «Метод-Адаптер»......................................................................................................... 358
Резюме.............................................................................................................................................. 361
Глава 12. Обработка ошибок и исключения ....................................................... 365
Основные концепции.................................................................................................................. 365
Основные исключения ............................................................................................................... 366
Аргументы исключения.......................................................................................................... 368
Перехват исключений................................................................................................................. 369
Блок try......................................................................................................................................... 369
Обработчики исключений..................................................................................................... 369
Прерывание и возобновление............................................................................................ 370
Создание собственных исключений ...................................................................................... 370
Вывод информации об исключениях .................................................................................... 373
Спецификация исключений..................................................................................................... 376
Перехват любого типа исключения........................................................................................ 377
Трассировка стека..................................................................................................................... 379
Повторное возбуждение исключения................................................................................ 379
Цепочки исключений .............................................................................................................. 382
Стандартные исключения Java ................................................................................................ 385
Особый случай: RuntimeException..................................................................................... 386
Завершение с помощью finally................................................................................................. 387
Для чего нужен блок finally?................................................................................................. 389
Использование finally при return ....................................................................................... 391
Ловушка: потерянное исключение ..................................................................................... 392
Ограничения исключений......................................................................................................... 394
Конструкторы................................................................................................................................ 397
Отождествление исключений.................................................................................................. 402
Альтернативные решения.......................................................................................................... 403
Предыстория .............................................................................................................................. 404
Перспективы............................................................................................................................... 406
Передача исключений на консоль....................................................................................... 408
Преобразование контролируемых исключений в неконтролируемые .................. 408
Рекомендации по использованию исключений............................................................. 411
Резюме.............................................................................................................................................. 411
14 Содержание
Глава 13. Строки .................................................................................................... 413
Постоянcтво строк ....................................................................................................................... 413
Перегрузка + и StringBuilder.................................................................................................... 414
Непреднамеренная рекурсия.................................................................................................... 418
Операции со строками ............................................................................................................ 419
Форматирование вывода ........................................................................................................... 421
printf() .......................................................................................................................................... 421
System.out.format() .................................................................................................................. 422
Класс Formatter......................................................................................................................... 422
Форматные спецификаторы ................................................................................................. 423
Преобразования Formatter.................................................................................................... 425
String.format() ........................................................................................................................... 427
Вывод файла в шестнадцатеричном виде......................................................................... 428
Регулярные выражения.............................................................................................................. 429
Основы.......................................................................................................................................... 429
Создание регулярных выражений...................................................................................... 432
Квантификаторы....................................................................................................................... 433
CharSequence ............................................................................................................................. 434
Pattern и Matcher...................................................................................................................... 434
find() ............................................................................................................................................. 436
Группы .......................................................................................................................................... 437
start() и end() ............................................................................................................................. 438
Флаги шаблонов........................................................................................................................ 440
split() ............................................................................................................................................ 442
Операции замены...................................................................................................................... 442
reset() ........................................................................................................................................... 444
Регулярные выражения и ввод-вывод в Java.................................................................. 445
Сканирование ввода ................................................................................................................ 446
Ограничители Scanner............................................................................................................ 448
Сканирование с использованием регулярных выражений........................................ 449
StringTokenizer .............................................................................................................................. 450
Резюме.............................................................................................................................................. 450
Глава 14. Информация о типах............................................................................. 451
Необходимость в динамическом определении типов (RTTI) ...................................... 451
Объект Class................................................................................................................................ 454
Литералы class......................................................................................................................... 459
Ссылки на обобщенные классы........................................................................................... 461
Новый синтаксис приведения типа.................................................................................... 463
Проверка перед приведением типов .................................................................................. 464
Использование литералов class............................................................................................ 470
Динамическая проверка типа ............................................................................................... 472
Рекурсивный подсчет ........................................................................................................... 473
Зарегистрированные фабрики................................................................................................. 475
instanceof и сравнение объектов Class............................................................................. 478
Содержание  15
Отражение: динамическая информация о классе ............................................................. 479
Извлечение информации о методах класса..................................................................... 480
Динамические заместители ...................................................................................................... 483
Null-объекты................................................................................................................................... 487
Фиктивные объекты и заглушки......................................................................................... 493
Интерфейсы и информация типов......................................................................................... 494
Резюме.............................................................................................................................................. 499
Глава 15. Обобщенные типы ................................................................................ 501
Сравнение с C++ .......................................................................................................................... 502
Простые обобщения..................................................................................................................... 503
Библиотека кортежей.............................................................................................................. 504
Класс стека .................................................................................................................................. 507
RandomList ................................................................................................................................. 508
Обобщенные интерфейсы ......................................................................................................... 509
Обобщенные методы................................................................................................................... 512
Использование автоматического определения аргументов-типов ......................... 513
Явное указание типа ................................................................................................................ 515
Списки аргументов переменной длины и обобщенные методы............................... 515
Обобщенный метод для использования с генераторами............................................ 516
Генератор общего назначения............................................................................................... 517
Упрощение использования кортежей................................................................................ 518
Операции с множествами ...................................................................................................... 520
Анонимные внутренние классы .............................................................................................. 523
Построение сложных моделей................................................................................................. 524
Загадка стирания.......................................................................................................................... 526
Подход C++.................................................................................................................................... 528
Миграционная совместимость............................................................................................. 530
Проблема стирания.................................................................................................................. 531
Граничные ситуации................................................................................................................ 533
Компенсация стирания............................................................................................................... 536
Создание экземпляров типов ............................................................................................... 537
Массивы обобщений................................................................................................................ 540
Ограничения .................................................................................................................................. 544
Маски................................................................................................................................................ 548
Насколько умен компилятор?.............................................................................................. 550
Контравариантность ............................................................................................................... 552
Неограниченные маски........................................................................................................... 555
Фиксация..................................................................................................................................... 560
Проблемы........................................................................................................................................ 561
Примитивы не могут использоваться как параметры-типы...................................... 561
Реализация параметризованных интерфейсов .............................................................. 563
Приведения типа и предупреждения................................................................................. 563
Перегрузка .................................................................................................................................. 565
Перехват интерфейса базовым классом............................................................................ 566
Самоограничиваемые типы ...................................................................................................... 567
16 Содержание
Необычные рекурсивные обобщения................................................................................ 567
Самоограничение...................................................................................................................... 568
Ковариантность аргументов ................................................................................................. 570
Динамическая безопасность типов ........................................................................................ 573
Исключения.................................................................................................................................... 574
Примеси ....................................................................................................................................... 576
Примеси в C++.......................................................................................................................... 576
Примеси с использованием интерфейсов ........................................................................ 577
Использование паттерна «Декоратор».............................................................................. 579
Примеси и динамические заместители............................................................................. 580
Латентная типизация.................................................................................................................. 582
Компенсация отсутствия латентной типизации ............................................................... 586
Отражение................................................................................................................................... 586
Применение метода к последовательности ..................................................................... 587
Если нужный интерфейс отсутствует ............................................................................... 590
Моделирование латентной типизации с использованием адаптеров .................... 591
Использование объектов функций как стратегий ............................................................ 594
Резюме.............................................................................................................................................. 599
Дополнительная литература................................................................................................. 601
Глава 16. Массивы ................................................................................................. 602
Особое отношение к массивам............................................................................................. 602
Массивы как полноценные объекты.................................................................................. 604
Возврат массива ............................................................................................................................ 607
Многомерные массивы............................................................................................................... 608
Массивы и обобщения................................................................................................................ 612
Создание тестовых данных ....................................................................................................... 614
Arrays.fill() .................................................................................................................................. 614
Генераторы данных................................................................................................................... 615
Применение генераторов для создания массивов............................................................. 620
Класс Arrays................................................................................................................................ 624
Копирование массива.............................................................................................................. 624
Сравнение массивов ................................................................................................................ 625
Сравнения элементов массивов........................................................................................... 626
Сортировка массива................................................................................................................. 630
Поиск в отсортированном массиве..................................................................................... 631
Резюме.............................................................................................................................................. 633
Глава 17. Подробнее о контейнерах .................................................................... 636
Полная таксономия контейнеров ........................................................................................... 636
Заполнение контейнеров ....................................................................................................... 637
Решение с Generator................................................................................................................ 638
Генераторы Map......................................................................................................................... 640
Использование классов Abstract......................................................................................... 643
Функциональность Collection ................................................................................................. 650
Содержание  17
Необязательные операции ........................................................................................................ 653
Неподдерживаемые операции.............................................................................................. 654
Функциональность List.............................................................................................................. 656
Set и порядок хранения .............................................................................................................. 659
SortedSet ...................................................................................................................................... 663
Очереди............................................................................................................................................ 664
Приоритетные очереди........................................................................................................... 665
Деки................................................................................................................................................... 666
Карты (Map)................................................................................................................................... 667
Производительность................................................................................................................ 669
SortedMap.......................