ОГЛАВЛЕНИЕ Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Кому следует читать эту книгу . . . . . . . . . . . . . . . Новые разработки . . . . . . . . . . . . . . . . . . . . . . . Новое в этом издании . . . . . . . . . . . . . . . . . . . . . Использование этой книги . . . . . . . . . . . . . . . . . Веб-ресурсы . . . . . . . . . . . . . . . . . . . . . . . . . . . Примеры к книге. . . . . . . . . . . . . . . . . . . . . . . . Условные обозначения, использованные в этой книге Использование примеров кода . . . . . . . . . . . . . . . Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . Глава 1. Современный язык . . . . . . . . . . . . . . . . . . . Появление Java . . . . . . . . . . . . . . . . . . . . . . . . . Происхождение Java. . . . . . . . . . . . . . . . . . . Становление. . . . . . . . . . . . . . . . . . . . . . . . Виртуальная машина . . . . . . . . . . . . . . . . . . . . . Java в сравнении с другими языками . . . . . . . . . . . Безопасное проектирование . . . . . . . . . . . . . . . . Упрощение, упрощение, упрощение . . . . . . . . . Безопасность типов и связывание методов . . . . Инкрементная разработка . . . . . . . . . . . . . . . Управление динамической памятью. . . . . . . . . Обработка ошибок . . . . . . . . . . . . . . . . . . . . Потоки . . . . . . . . . . . . . . . . . . . . . . . . . . . Масштабируемость . . . . . . . . . . . . . . . . . . . Безопасность реализации . . . . . . . . . . . . . . . . . . Верификатор . . . . . . . . . . . . . . . . . . . . . . . Загрузчики классов . . . . . . . . . . . . . . . . . . . Диспетчеры безопасности . . . . . . . . . . . . . . . Приложение и безопасность на уровне пользователя . История и перспективы развития Java . . . . . . . . . . Прошлое: Java 1.0 — Java 1.6 . . . . . . . . . . . . . . Java 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . Настоящее: Java 8 . . . . . . . . . . . . . . . . . . . . Будущее . . . . . . . . . . . . . . . . . . . . . . . . . . Доступность . . . . . . . . . . . . . . . . . . . . . . . . Глава 2. Первое применение . . . . . . . . . . . . . . . . . . . Инструменты и среда Java . . . . . . . . . . . . . . . . . . Конфигурация Eclipse и создание проекта. . . . . . . . Импорт примеров по изучению Java. . . . . . . . . HelloJava . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . Метод main() . . . . . . . . . . . . . . . . . . . . . . . Классы и объекты . . . . . . . . . . . . . . . . . . . . Переменные и типы классов. . . . . . . . . . . . . . HelloComponent . . . . . . . . . . . . . . . . . . . . . . Наследование . . . . . . . . . . . . . . . . . . . . . . . Класс JComponent . . . . . . . . . . . . . . . . . . . . . Связи и поиск виновных . . . . . . . . . . . . . . . . Пакеты и инструкции импорта . . . . . . . . . . . . Метод paintComponent() . . . . . . . . . . . . . . . . HelloJava2: продолжение . . . . . . . . . . . . . . . . . . Переменные экземпляра . . . . . . . . . . . . . . . . Конструкторы. . . . . . . . . . . . . . . . . . . . . . . События . . . . . . . . . . . . . . . . . . . . . . . . . . Метод repaint() . . . . . . . . . . . . . . . . . . . . . Интерфейсы . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 17 . 18 . 18 . 19 . 20 . 22 . 22 . 22 . 23 . 24 . 25 . 26 . 26 . 28 . 29 . 33 . 37 . 38 . 39 . 41 . 41 . 43 . 43 . 44 . 45 . 47 . 48 . 49 . 50 . 51 . 52 . 53 . 56 . 74 . 74 . 75 . 75 . 77 . 78 . 79 . 82 . 83 . 85 . 86 . 87 . 88 . 89 . 90 . 91 . 93 . 95 . 96 . 97 . 99 102 103
5
Оглавление
HelloJava3: атака класса JButton! . . . . . . . . . . . . . . . . . . . . . . . Перегрузка метода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Компоненты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Контейнеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Диспетчеры компоновки . . . . . . . . . . . . . . . . . . . . . . . . . Подклассы и подтипы. . . . . . . . . . . . . . . . . . . . . . . . . . . Больше событий и интерфейсов . . . . . . . . . . . . . . . . . . . . Замечание относительно цвета . . . . . . . . . . . . . . . . . . . . . Статические члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Методы для класса Color . . . . . . . . . . . . . . . . . . . . . . . . . HelloJava4: месть Netscape . . . . . . . . . . . . . . . . . . . . . . . . . . . Потоки выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс Thread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс Runnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . Запуск потока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Выполнение кода в классе Thread . . . . . . . . . . . . . . . . . . . Исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Синхронизация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 3. Инструменты для работы . . . . . . . . . . . . . . . . . . . . . . . . Среда JDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Виртуальная машина Java . . . . . . . . . . . . . . . . . . . . . . . . . . . Запуск приложения Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . Свойства системы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Переменная среды Classpath . . . . . . . . . . . . . . . . . . . . . . . . . Утилита javap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Компилятор Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Файлы JAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сжатие файлов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Утилита jar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Утилита pack200 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Файлы политики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Стандартный диспетчер безопасности . . . . . . . . . . . . . . . . Утилита policytool . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование файла политики со стандартным диспетчером безопасности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 4. Язык Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Кодировка текста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Комментарии Javadoc . . . . . . . . . . . . . . . . . . . . . . . . . . Типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Простые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ссылочные типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Слово о строках. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Операторы и выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Исключения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Исключения и классы ошибок . . . . . . . . . . . . . . . . . . . . . Обработка исключений . . . . . . . . . . . . . . . . . . . . . . . . . . Восхождение исключений . . . . . . . . . . . . . . . . . . . . . . . . Трассировка стека . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Проверяемые и непроверяемые исключения . . . . . . . . . . . . Выброс исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разумное использование оператора try . . . . . . . . . . . . . . . . Оператор finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Оператор try с очисткой ресурсов . . . . . . . . . . . . . . . . . . . Проблемы, связанные с производительностью . . . . . . . . . . . Утверждения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Включение и выключение утверждений . . . . . . . . . . . . . . . Использование утверждений . . . . . . . . . . . . . . . . . . . . . .
6
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
104 107 107 108 109 110 110 112 112 113 114 116 118 119 120 120 121 122 124 126 126 127 128 129 130 132 133 135 135 136 140 141 141 142
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . .
144 145 145 147 147 149 150 155 158 158 159 168 173 174 177 179 180 181 183 187 188 189 191 192 193 194
Оглавление
Массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Типы массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание и инициализация массива. . . . . . . . . . . . . . . . . . . . Использование массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . Анонимные массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Многомерные массивы . . . . . . . . . . . . . . . . . . . . . . . . . . . . Внутри массивов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 5. Объекты в Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Доступ к полям и методам . . . . . . . . . . . . . . . . . . . . . . . . . . Статические члены . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Локальные переменные. . . . . . . . . . . . . . . . . . . . . . . . . . . . Сокрытие. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Статические методы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Инициализация локальных переменных . . . . . . . . . . . . . . . . . Передача аргументов и ссылки . . . . . . . . . . . . . . . . . . . . . . . Обертки для простых типов . . . . . . . . . . . . . . . . . . . . . . . . . Автоматическое упаковывание и распаковывание простых типов . Список аргументов переменной длины . . . . . . . . . . . . . . . . . . Перегрузка метода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание объектов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Работа с перегруженными конструкторами . . . . . . . . . . . . . . . Статические и нестатические блоки инициализаторов . . . . . . . . Разрушение объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сборка мусора . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Завершение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Слабые и мягкие ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Значения класса Enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Изменение перечислений . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 6. Отношения между классами . . . . . . . . . . . . . . . . . . . . . . . . Создание подклассов и наследование . . . . . . . . . . . . . . . . . . . . . . Перекрытие переменных . . . . . . . . . . . . . . . . . . . . . . . . . . Переопределение методов . . . . . . . . . . . . . . . . . . . . . . . . . . Специальные ссылки: this и super . . . . . . . . . . . . . . . . . . . . Приведение типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование конструкторов надклассов . . . . . . . . . . . . . . . Полное разоблачение: конструкторы и инициализация . . . . . . . Абстрактные методы и классы . . . . . . . . . . . . . . . . . . . . . . . Интерфейсы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейсы и обратные вызовы . . . . . . . . . . . . . . . . . . . . . . Переменные интерфейса . . . . . . . . . . . . . . . . . . . . . . . . . . . Субинтерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пакеты и блоки компиляции . . . . . . . . . . . . . . . . . . . . . . . . . . . Блоки компиляции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Имена пакетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Видимость класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Импорт классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Видимость переменных и методов . . . . . . . . . . . . . . . . . . . . . . . . Базовые модификаторы доступа . . . . . . . . . . . . . . . . . . . . . . Подклассы и видимость . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейсы и видимость . . . . . . . . . . . . . . . . . . . . . . . . . . Массивы и иерархия классов . . . . . . . . . . . . . . . . . . . . . . . . . . . Исключение ArrayStoreException . . . . . . . . . . . . . . . . . . . . . Внутренние классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Внутренние классы и адаптеры . . . . . . . . . . . . . . . . . . . . . . . Внутренние классы внутри методов . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
196 197 198 200 202 203 205 206 207 209 211 215 216 216 218 219 220 222 224 226 227 229 230 231 233 235 235 236 237 239 240 241 243 243 246 248 256 257 260 261 262 263 266 267 269 270 270 271 272 272 275 275 277 278 278 280 280 283 285
7
Оглавление
Глава 7. Работа с объектами и классами . . . . . . . . . . . . . . . . . . . Класс Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Равенство и эквивалентность . . . . . . . . . . . . . . . . . . . . . Хеш-коды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Клонирование объектов . . . . . . . . . . . . . . . . . . . . . . . . Класс Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Отражение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Модификаторы и безопасность . . . . . . . . . . . . . . . . . . . . Доступ к полям . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Доступ к методам . . . . . . . . . . . . . . . . . . . . . . . . . . . . Доступ к конструкторам . . . . . . . . . . . . . . . . . . . . . . . . Что насчет массивов? . . . . . . . . . . . . . . . . . . . . . . . . . . Доступ к информации обобщенного типа . . . . . . . . . . . . . Доступ к данным аннотаций. . . . . . . . . . . . . . . . . . . . . . Адаптеры с динамическим интерфейсом . . . . . . . . . . . . . . Для чего подходит отражение? . . . . . . . . . . . . . . . . . . . . Аннотации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование аннотаций . . . . . . . . . . . . . . . . . . . . . . . Cтандартные аннотации . . . . . . . . . . . . . . . . . . . . . . . . Инструмент apt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 8. Обобщения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Контейнеры: новый уровень абстракций . . . . . . . . . . . . . . . . . Можно ли исправить контейнеры? . . . . . . . . . . . . . . . . . Ввод обобщений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разговор о типах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . «Ложки не существует» . . . . . . . . . . . . . . . . . . . . . . . . . . . Стирание . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Необработанные типы . . . . . . . . . . . . . . . . . . . . . . . . . Отношения параметризированных типов . . . . . . . . . . . . . . . . Почему List<Date> не является List<Object>? . . . . . . . . . . Приведение типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Написание обобщенных классов . . . . . . . . . . . . . . . . . . . . . . Переменная типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Наследование обобщений . . . . . . . . . . . . . . . . . . . . . . . Исключения и обобщения . . . . . . . . . . . . . . . . . . . . . . . Ограничения, связанные с типом параметра . . . . . . . . . . . Границы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Стирание и границы (работа со старым кодом). . . . . . . . . . Групповые символы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Супертип для всех реализаций . . . . . . . . . . . . . . . . . . . . Ограниченные групповые типы . . . . . . . . . . . . . . . . . . . Групповые типы в контексте контейнеров . . . . . . . . . . . . . Нижние границы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Чтение, запись и арифметические операции . . . . . . . . . . . <?>, <Object> и необработанный тип . . . . . . . . . . . . . . . . . Отношения группового типа . . . . . . . . . . . . . . . . . . . . . Обобщенные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с обобщенными методами . . . . . . . . . . . . . . . Выведение типа из аргументов . . . . . . . . . . . . . . . . . . . . Выведение типа из контекста назначений . . . . . . . . . . . . . Явный вызов типа . . . . . . . . . . . . . . . . . . . . . . . . . . . . Перехват группового типа . . . . . . . . . . . . . . . . . . . . . . . Выбор между групповыми типами и обобщенными методами Массивы параметризованных типов . . . . . . . . . . . . . . . . . . . Использование типов массивов. . . . . . . . . . . . . . . . . . . . Чем хороши массивы обобщенных типов?. . . . . . . . . . . . . Групповые типы в типах массивов . . . . . . . . . . . . . . . . . . Пример: класс Enum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пример: метод sort() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
294 294 295 296 297 301 304 307 308 310 312 313 313 314 315 317 318 319 321 321 323 324 325 326 330 330 331 333 335 337 338 340 340 341 342 343 346 347 348 349 349 350 351 352 354 355 357 358 359 360 361 361 362 363 364 365 365 366 368 369
Оглавление
Глава 9. Потоки выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . Введение в потоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс Thread Class и интерфейс Runnable . . . . . . . . . . . . . . . Управление потоками . . . . . . . . . . . . . . . . . . . . . . . . . . Смерть потока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Выполнение апплета в нескольких потоках . . . . . . . . . . . . . . . . Отслеживание проблем. . . . . . . . . . . . . . . . . . . . . . . . . . Синхронизация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Синхронизированный доступ к методам . . . . . . . . . . . . . . . Класс доступа и переменные экземпляров объекта из потоков многопоточных программ . . . . . . . . . . . . . . . . . . . . . . . . Методы wait() и notify() . . . . . . . . . . . . . . . . . . . . . . . . Передача сообщений . . . . . . . . . . . . . . . . . . . . . . . . . . . Объекты ThreadLocal . . . . . . . . . . . . . . . . . . . . . . . . . . . Планирование и приоритеты . . . . . . . . . . . . . . . . . . . . . . . . . Состояние потока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Временные интервалы . . . . . . . . . . . . . . . . . . . . . . . . . . Приоритеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Возвращение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Группы потоков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Работа с классом ThreadGroup . . . . . . . . . . . . . . . . . . . . . . Непроверяемые исключения . . . . . . . . . . . . . . . . . . . . . . Выполнение потока . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Издержки синхронизации . . . . . . . . . . . . . . . . . . . . . . . . Потребление ресурсов потоком. . . . . . . . . . . . . . . . . . . . . Средства для поддержки параллелизма . . . . . . . . . . . . . . . . . . Исполнители . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Блокировки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Средства синхронизации . . . . . . . . . . . . . . . . . . . . . . . . . Атомарные операции . . . . . . . . . . . . . . . . . . . . . . . . . . . Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 10. Работа с текстом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . API, связанные с текстом . . . . . . . . . . . . . . . . . . . . . . . . . . . Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание строк на основе различных типов . . . . . . . . . . . . . Сравнение строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Поиск . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Редактирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Краткое описание методов объекта String . . . . . . . . . . . . . . Объекты StringBuilder и StringBuffer . . . . . . . . . . . . . . . . Интернационализация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс java.util.Locale . . . . . . . . . . . . . . . . . . . . . . . . . . Наборы ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разбор и форматирование текста . . . . . . . . . . . . . . . . . . . . . . Разбор простых чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . Разметка текста. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Форматирование Printf-Style . . . . . . . . . . . . . . . . . . . . . . . . Программа форматирования . . . . . . . . . . . . . . . . . . . . . . Строка форматирования . . . . . . . . . . . . . . . . . . . . . . . . . Преобразования строк . . . . . . . . . . . . . . . . . . . . . . . . . . Простые и числовые преобразования . . . . . . . . . . . . . . . . . Флаги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Прочие положения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Форматирование при помощи пакета java.text . . . . . . . . . . . . . Средство MessageFormat . . . . . . . . . . . . . . . . . . . . . . . . . . Регулярные выражения . . . . . . . . . . . . . . . . . . . . . . . . . . . . Язык регулярных выражений . . . . . . . . . . . . . . . . . . . . . . java.util.regex API . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
370 371 372 377 380 382 384 385 386
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
389 390 393 398 399 401 402 403 404 405 406 406 407 407 408 409 411 427 430 436 439 440 441 441 442 444 445 447 448 449 450 452 452 453 456 457 459 461 462 462 464 466 468 469 469 472 474 475 488
9
Оглавление
Глава 11. Основные инструменты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Математические инструменты . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс java.lang.Math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Большие/точные числа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Компоненты числа с плавающей запятой . . . . . . . . . . . . . . . . . . Случайные числа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Дата и время . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Работа с календарями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Часовые пояса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разбор и форматирование даты при помощи класса DateFormat . . . . Форматирование даты и времени в стиле метода printf . . . . . . . . . Таймеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Коллекции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Итератор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Виды коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс Map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Реализации коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Хеш-коды и ключи. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Синхронизированные и несинхронизированные коллекции . . . . . . Коллекции, предназначенные только/преимущественно для чтения . Класс WeakHashMap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Классы EnumSet и EnumMap. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сортировка коллекций . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Захватывающий пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Загрузка и сохранение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Системные свойства. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Технология Preferences API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Применение технологии Preferences API для классов. . . . . . . . . . . Хранилище конфигурационных данных . . . . . . . . . . . . . . . . . . . Уведомления об изменениях . . . . . . . . . . . . . . . . . . . . . . . . . . API-интерфейсы для ведения журнала сообщений . . . . . . . . . . . . . . . Обзор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Уровни журнальных сообщений . . . . . . . . . . . . . . . . . . . . . . . . Простой пример . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Изменение свойств журнала. . . . . . . . . . . . . . . . . . . . . . . . . . . Класс Logger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Производительность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс Observer и класс Observable . . . . . . . . . . . . . . . . . . . . . . Глава 12. Средства ввода/вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Потоки ввода/вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Основы ввода/вывода. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Потоки символов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обертки для потоков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Конвейеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Чтение и запись потоков строк . . . . . . . . . . . . . . . . . . . . . . . . . Реализация фильтрующего потока. . . . . . . . . . . . . . . . . . . . . . . Файловый ввод/вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс java.io.File. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Файловые потоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс RandomAccessFile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пути к ресурсам . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . API-интерфейс пакета NIO для работы с файлами . . . . . . . . . . . . . . . Классы FileSystem и Path. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Файловые операции, предоставляемые пакетом NIO . . . . . . . . . . . Операции с директориями . . . . . . . . . . . . . . . . . . . . . . . . . . . . Отслеживание путей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сериализация. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Инициализация объектов с помощью метода readObject() . . . . . . . Идентификатор serialVersionUID . . . . . . . . . . . . . . . . . . . . . . .
10
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
496 496 497 499 500 501 502 503 505 508 510 512 514 515 519 520 524 527 533 535 538 538 539 539 540 542 543 545 546 547 548 549 550 551 554 555 556 558 559 560 563 563 567 570 572 577 579 581 583 583 590 594 595 598 599 601 605 608 609 611 613
Оглавление
Сжатие данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Архивы и сжатие данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Распаковка данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ZIP-архив в качестве файловой системы . . . . . . . . . . . . . . . . . . . Пакет NIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Асинхронный ввод/вывод . . . . . . . . . . . . . . . . . . . . . . . . . . . . Производительность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Блокирование файлов и отображение их в память. . . . . . . . . . . . . Каналы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Буферы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Кодирование и декодирование символов. . . . . . . . . . . . . . . . . . . Класс FileChannel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Масштабируемый ввод/вывод и пакет NIO . . . . . . . . . . . . . . . . . Глава 13. Сетевое программирование . . . . . . . . . . . . . . . . . . . . . . . . . . Сокеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Клиенты и серверы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Клиентское приложение DateAtHost . . . . . . . . . . . . . . . . . . . . . . Серверное приложение TinyHttpd. . . . . . . . . . . . . . . . . . . . . . . Свойства сокетов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Прокси и брандмауэры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Датаграммные сокеты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Апплет HeartBeat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс InetAddress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Простой протокол для передачи сериализованных объектов . . . . . . . . . Простой сервер для обмена объектами . . . . . . . . . . . . . . . . . . . . Удаленный вызов методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Реальное применение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Удаленные и локальные объекты. . . . . . . . . . . . . . . . . . . . . . . . Пример использования технологии RMI. . . . . . . . . . . . . . . . . . . RMI и CORBA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Масштабируемый ввод/вывод на основе пакета NIO . . . . . . . . . . . . . . Выборочные каналы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование селекторов . . . . . . . . . . . . . . . . . . . . . . . . . . . Приложение LargerHttpd . . . . . . . . . . . . . . . . . . . . . . . . . . . . Неблокирующие операции на клиентской стороне . . . . . . . . . . . . Глава 14. Веб-программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Единый указатель ресурсов (URL) . . . . . . . . . . . . . . . . . . . . . . . . . Класс URL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Потоковая передача данных . . . . . . . . . . . . . . . . . . . . . . . . . . . Получение данных в виде объекта . . . . . . . . . . . . . . . . . . . . . . . Управление соединениями. . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование обработчиков в реальных задачах . . . . . . . . . . . . . Технологии обработки данных, на которые стоит обратить внимание Взаимодействие с веб-приложениями . . . . . . . . . . . . . . . . . . . . . . . Использование запросов типа GET . . . . . . . . . . . . . . . . . . . . . . Использование запросов типа POST . . . . . . . . . . . . . . . . . . . . . Класс HttpURLConnection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Технология SSL и безопасность при взаимодействии с веб-приложениями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Идентификаторы URL, URN и URI . . . . . . . . . . . . . . . . . . . . . . Веб-сервисы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Технология XML-RPC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Язык WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Инструменты для работы с веб-сервисами. . . . . . . . . . . . . . . . . . Клиент для метеослужбы . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 15. Веб-приложения и веб-сервисы . . . . . . . . . . . . . . . . . . . . . . . Технологии, лежащие в основе веб-приложений . . . . . . . . . . . . . . . . . Многостраничные и одностраничные приложения . . . . . . . . . . . . JSP-сценарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XML и XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Фреймворки для создания веб-приложений . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
614 614 617 619 621 621 622 622 622 623 628 631 639 641 643 645 651 653 659 661 664 665 670 671 672 677 678 678 683 693 693 695 696 698 704 705 705 706 708 709 710 711 712 713 714 715 719
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
. . . . . . . . . . . . .
719 720 721 722 722 723 723 726 727 728 729 730 730
11
Оглавление
Google Web Toolkit . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML5, AJAX и т. д.. . . . . . . . . . . . . . . . . . . . . . . . . . Веб-приложения на платформе Java . . . . . . . . . . . . . . . . . . Жизненный цикл сервлета. . . . . . . . . . . . . . . . . . . . . . Сервлеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сервлет HelloClient . . . . . . . . . . . . . . . . . . . . . . . . . . Ответ сервлета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Параметры сервлета . . . . . . . . . . . . . . . . . . . . . . . . . . Сервлет ShowParameters . . . . . . . . . . . . . . . . . . . . . . . . Управление пользовательскими сессиями . . . . . . . . . . . . Сервлет ShowSession . . . . . . . . . . . . . . . . . . . . . . . . . . Сервлет ShoppingCart . . . . . . . . . . . . . . . . . . . . . . . . . Файлы cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс ServletContext . . . . . . . . . . . . . . . . . . . . . . Асинхронные сервлеты . . . . . . . . . . . . . . . . . . . . . . . . WAR-файлы и развертывание веб-приложений . . . . . . . . . . . Конфигурирование с помощью файла web.xml и аннотаций Привязка к URL-шаблонам . . . . . . . . . . . . . . . . . . . . . Развертывание сервлета HelloClient . . . . . . . . . . . . . . . Вывод ошибок и индексные страницы . . . . . . . . . . . . . . Безопасность и аутентификация . . . . . . . . . . . . . . . . . . Защита ресурсов с помощью ролей безопасности . . . . . . . Защищенная передача данных . . . . . . . . . . . . . . . . . . . Аутентификация пользователей . . . . . . . . . . . . . . . . . . Авторизация в императивном стиле . . . . . . . . . . . . . . . . Фильтры сервлетов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Простой фильтр . . . . . . . . . . . . . . . . . . . . . . . . . . . . Тестовый сервлет. . . . . . . . . . . . . . . . . . . . . . . . . . . . Объявление и привязка фильтров . . . . . . . . . . . . . . . . . Фильтрация запроса к сервлету . . . . . . . . . . . . . . . . . . Фильтрация ответа, который возвращается сервлетом . . . . Создание WAR-файлов с помощью утилиты Ant . . . . . . . . . . Иерархия директорий, ориентированная на разработку . . . Развертывание WAR-архивов с помощью утилиты Ant. . . . Реализация веб-сервисов . . . . . . . . . . . . . . . . . . . . . . . . . Объявление сервиса . . . . . . . . . . . . . . . . . . . . . . . . . . Наш веб-сервис Echo . . . . . . . . . . . . . . . . . . . . . . . . . Использование сервиса . . . . . . . . . . . . . . . . . . . . . . . . Типы данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Итог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 16. Библиотека Swing . . . . . . . . . . . . . . . . . . . . . . . . . . Компоненты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Системные компоненты и внешний вид . . . . . . . . . . . . . Архитектура MVC в пользовательских интерфейсах . . . . . Рисование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Включение и отключение компонентов . . . . . . . . . . . . . Фокусируемся . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Другие методы класса JComponent . . . . . . . . . . . . . . . . . Диспетчеры компоновки . . . . . . . . . . . . . . . . . . . . . . . Вставки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Порядок наложения компонентов . . . . . . . . . . . . . . . . . Методы revalidate() и doLayout() . . . . . . . . . . . . . . . . . Управление компонентами . . . . . . . . . . . . . . . . . . . . . Прослушивание компонентов. . . . . . . . . . . . . . . . . . . . JFrame и JWindow . . . . . . . . . . . . . . . . . . . . . . . . . . . Другие методы для управления окнами . . . . . . . . . . . . . Панели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интеграция с настольной средой. . . . . . . . . . . . . . . . . . События . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Получатели событий и интерфейс EventListener. . . . . . . . Источники событий . . . . . . . . . . . . . . . . . . . . . . . . . . Доставка событий . . . . . . . . . . . . . . . . . . . . . . . . . . . Типы событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
731 731 732 733 734 735 738 739 741 743 744 747 750 752 753 757 759 762 763 765 767 768 769 771 773 774 775 777 778 779 781 785 786 788 788 789 790 791 793 795 796 800 802 804 805 807 807 808 810 811 811 812 813 813 813 816 816 817 820 821 823 825 826
Оглавление
Класс java.awt.event.InputEvent. . . . . . . . . . . . . . . . . . . . . . . Модификаторы, связанные с мышью и клавиатурой . . . . . . . . . . События, связанные с выделением компонентов. . . . . . . . . . . . . Список часто используемых событий . . . . . . . . . . . . . . . . . . . . Классы адаптеров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Шаблонные адаптеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Настоящий робот в библиотеке AWT! . . . . . . . . . . . . . . . . . . . . . . Многопоточность в библиотеке Swing . . . . . . . . . . . . . . . . . . . . . . Глава 17. Использование компонентов библиотеки Swing. . . . . . . . . . . . Кнопки и метки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разметка текста в кнопках и метках с помощью формата HTML. . . Флажки и переключатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обычные и раскрывающиеся списки . . . . . . . . . . . . . . . . . . . . . . . Поле ввода со счетчиком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обрамление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Меню . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Контекстные меню. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Управление контекстным меню на уровне отдельных компонентов . Класс JScrollPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс JSplitPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс JTabbedPane . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Полосы прокрутки и ползунковые регуляторы. . . . . . . . . . . . . . . . . Диалоговые окна . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Диалоговое окно выбора файлов . . . . . . . . . . . . . . . . . . . . . . . Диалоговое окно выбора цвета . . . . . . . . . . . . . . . . . . . . . . . . Глава 18. Другие компоненты библиотеки Swing . . . . . . . . . . . . . . . . . . Компоненты для работы с текстом . . . . . . . . . . . . . . . . . . . . . . . . Приложение TextEntryBox . . . . . . . . . . . . . . . . . . . . . . . . . . Форматированный текст . . . . . . . . . . . . . . . . . . . . . . . . . . . . Фильтрация ввода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Проверка данных. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сезам, откройся! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Использование общей модели данных . . . . . . . . . . . . . . . . . . . Встроенная поддержка форматов HTML и RTF . . . . . . . . . . . . . Работа с текстом вручную . . . . . . . . . . . . . . . . . . . . . . . . . . . Навигация посредством выделения компонентов . . . . . . . . . . . . . . . Древовидные списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Узлы и модели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Стандартное поведение древовидного списка. . . . . . . . . . . . . . . События в древовидном списке. . . . . . . . . . . . . . . . . . . . . . . . Готовый пример. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Таблицы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Раунд первый: сразу в бой . . . . . . . . . . . . . . . . . . . . . . . . . . . Раунд второй: создание модели данных . . . . . . . . . . . . . . . . . . Раунд третий: простая электронная таблица . . . . . . . . . . . . . . . Сортировка и фильтрация . . . . . . . . . . . . . . . . . . . . . . . . . . . Печать таблиц. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Рабочие столы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Изменение внешнего вида . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание нестандартных компонентов . . . . . . . . . . . . . . . . . . . . . . Генерирование событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Круговой регулятор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Отделение модели данных от представления . . . . . . . . . . . . . . . Глава 19. Диспетчеры компоновки . . . . . . . . . . . . . . . . . . . . . . . . . . . FlowLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GridLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BorderLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . BoxLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CardLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . GridBagLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс GridBagConstraints . . . . . . . . . . . . . . . . . . . . . . . . . . . Координаты сетки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
827 827 829 831 833 836 838 839 843 843 846 847 851 854 857 861 865 868 870 872 873 878 880 884 887 888 888 889 892 893 895 897 898 900 904 906 908 909 910 910 911 914 914 917 920 924 927 928 929 933 933 934 938 940 942 944 945 948 950 952 953 955
13
Оглавление
Параметр fill . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Заполнение нескольких строк или столбцов . . . . . . . . . . . Параметры weightx и weighty . . . . . . . . . . . . . . . . . . . . . Параметр anchor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Внутренние и внешние отступы . . . . . . . . . . . . . . . . . . . Относительное позиционирование . . . . . . . . . . . . . . . . . Совместное использование разных диспетчеров компоновки. Другие диспетчеры компоновки . . . . . . . . . . . . . . . . . . . . . . Абсолютное позиционирование . . . . . . . . . . . . . . . . . . . . . . Глава 20. Рисование с использованием 2D API . . . . . . . . . . . . . . . Общая картина . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Конвейер визуализации . . . . . . . . . . . . . . . . . . . . . . . . . . . Краткий тур по Java 2D. . . . . . . . . . . . . . . . . . . . . . . . . . . . Заполнение форм . . . . . . . . . . . . . . . . . . . . . . . . . . . . Рисование контура формы . . . . . . . . . . . . . . . . . . . . . . . Удобные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Рисование текста . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Рисование изображений . . . . . . . . . . . . . . . . . . . . . . . . Пример целиком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Закрашивание форм. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сплошные цвета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Цветовой градиент. . . . . . . . . . . . . . . . . . . . . . . . . . . . Текстуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Системная палитра . . . . . . . . . . . . . . . . . . . . . . . . . . . Штрихование контуров формы. . . . . . . . . . . . . . . . . . . . . . . Использование шрифтов. . . . . . . . . . . . . . . . . . . . . . . . . . . Метрики шрифта. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Вывод изображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс Image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обозреватели изображений . . . . . . . . . . . . . . . . . . . . . . Размер и масштабирование . . . . . . . . . . . . . . . . . . . . . . Техники рисования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Двойная буферизация. . . . . . . . . . . . . . . . . . . . . . . . . . Ограниченное рисование с отсечением . . . . . . . . . . . . . . . Внеэкранное рисование. . . . . . . . . . . . . . . . . . . . . . . . . Печать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 21. Работа с изображениями и другими медиаданными . . . . . Загрузка изображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . Интерфейс ImageObserver . . . . . . . . . . . . . . . . . . . . . . . Класс MediaTracker. . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс ImageIcon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Класс ImageIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание растровых данных . . . . . . . . . . . . . . . . . . . . . . . . Создание анимации . . . . . . . . . . . . . . . . . . . . . . . . . . . Анатомия класса BufferedImage . . . . . . . . . . . . . . . . . . . Цветовые модели. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание изображения . . . . . . . . . . . . . . . . . . . . . . . . . Обновление BufferedImage . . . . . . . . . . . . . . . . . . . . . . . Настройка обрабатываемых изображений . . . . . . . . . . . . . Как работает приложение ImageProcessor . . . . . . . . . . . . . Преобразование объекта Image в объект BufferedImage . . . . . Использование класса RescaleOp . . . . . . . . . . . . . . . . . . . Использование класса AffineTransformOp . . . . . . . . . . . . . . Сохранение обрабатываемого изображения . . . . . . . . . . . . Работа со звуком . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java Media Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 22. JavaBeans. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Что такое bean-компонент? . . . . . . . . . . . . . . . . . . . . . . . . . Состав bean-компонента . . . . . . . . . . . . . . . . . . . . . . . . NetBeans IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Установка и запуск NetBeans . . . . . . . . . . . . . . . . . . . . .
14
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. 957 . 958 . 960 . 963 . 963 . 965 . 966 . 971 . 972 . 973 . 973 . 976 . 979 . 979 . 979 . 980 . 981 . 981 . 983 . 986 . 986 . 987 . 987 . 988 . 989 . 989 . 991 . 996 . 997 . 998 1001 1002 1005 1006 1009 1012 1015 1016 1016 1019 1022 1023 1024 1025 1028 1031 1032 1034 1038 1041 1042 1042 1043 1044 1045 1047 1050 1050 1052 1053 1054
Оглавление
Свойства и настройки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Подключения и адаптеры событий . . . . . . . . . . . . . . . . . . . . . . Добавление таймера в приложение Juggler . . . . . . . . . . . . . . Движение молекул. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Связывание свойств. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Принудительные свойства . . . . . . . . . . . . . . . . . . . . . . . . . Создание bean-компонентов . . . . . . . . . . . . . . . . . . . . . . . . . . Bean-компонент Dial . . . . . . . . . . . . . . . . . . . . . . . . . . . . Разработка шаблонов для свойств . . . . . . . . . . . . . . . . . . . . Ограничения визуальной разработки . . . . . . . . . . . . . . . . . . . . . Создание сериализованой версии кода . . . . . . . . . . . . . . . . . . . . Использование класса BeanInfo . . . . . . . . . . . . . . . . . . . . . . . . Получение информации о свойствах . . . . . . . . . . . . . . . . . . Получение информации о событиях. . . . . . . . . . . . . . . . . . . Добавление значков . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание настройщиков и редакторов свойств . . . . . . . . . . . . Программирование вручную с применением bean-компонентов . . . . Установка bean-компонентов и управление типами . . . . . . . . . Работа с сериализованными bean-компонентами . . . . . . . . . . Отслеживание событий выполнения с применением рефлексии. BeanContext и BeanContextServices . . . . . . . . . . . . . . . . . . . . . . . Java Activation Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . Технология JavaBeans и фреймворки промышленного уровня, основанные на обычных объектах . . . . . . . . . . . . . . . . . . . . . . . Глава 23. Апплеты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Политика браузерных приложений . . . . . . . . . . . . . . . . . . . . . . Поддержка апплетов и Java-плагины . . . . . . . . . . . . . . . . . . . . . Класс JApplet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Жизненный цикл апплета . . . . . . . . . . . . . . . . . . . . . . . . . «Песочница» безопасности для апплетов . . . . . . . . . . . . . . . Обзор ресурсов апплетов. . . . . . . . . . . . . . . . . . . . . . . . . . Элемент applet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Атрибуты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Параметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ¿Habla Applet? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Полная версия тега <applet> . . . . . . . . . . . . . . . . . . . . . . . Загрузка файлов классов . . . . . . . . . . . . . . . . . . . . . . . . . Пакеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . appletviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Java Web Start. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Глава 24. XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Обзор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Немного предыстории . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Сравнение текстовых и двоичных данных . . . . . . . . . . . . . . . Универсальный синтаксический анализатор . . . . . . . . . . . . . Положение языка XML. . . . . . . . . . . . . . . . . . . . . . . . . . . XML API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XML и веб-браузеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . Основы XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Атрибуты. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XML-документы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Кодировка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пространство имен . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Проверка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML в XHTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SAX API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание модели с использованием SAX . . . . . . . . . . . . . . . XMLEncoder/Decoder . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
1057 1060 1061 1063 1065 1067 1067 1068 1071 1072 1073 1074 1075 1076 1077 1078 1079 1079 1080 1083 1085 1086
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1086 1088 1089 1090 1091 1092 1096 1098 1103 1103 1104 1105 1105 1107 1108 1109 1109 1110 1111 1111 1112 1113 1114 1114 1115 1115 1115 1116 1117 1117 1118 1120 1120 1121 1121 1123 1131
15
Оглавление
DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . DOM API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Тест-драйв DOM . . . . . . . . . . . . . . . . . . . . . . . . . Создание XML с DOM . . . . . . . . . . . . . . . . . . . . . JDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Узлы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Предикаты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XPath API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XMLGrep. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XInclude . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Подключение XInclude . . . . . . . . . . . . . . . . . . . . . Проверка документов . . . . . . . . . . . . . . . . . . . . . . . . . Использование средств проверки документов . . . . . . Элементы языка DTD. . . . . . . . . . . . . . . . . . . . . . XML Schema. . . . . . . . . . . . . . . . . . . . . . . . . . . . Верификация API . . . . . . . . . . . . . . . . . . . . . . . . Связывание и генерация кода JAXB . . . . . . . . . . . . . . . Описание нашей модели . . . . . . . . . . . . . . . . . . . . Создание модели Java из XML Schema . . . . . . . . . . . Создание XML-схемы из Java-модели . . . . . . . . . . . Преобразование документов с использованием XSL/XSLT . Основы XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . Преобразование каталога . . . . . . . . . . . . . . . . . . . Преобразование XLS . . . . . . . . . . . . . . . . . . . . . . XLS в браузере . . . . . . . . . . . . . . . . . . . . . . . . . . Веб-сервисы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Пара слов в заключение . . . . . . . . . . . . . . . . . . . . . . . Приложение А. Среда разработки Eclipse . . . . . . . . . . . . . . Войны IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Знакомство с Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . Импорт учебных примеров Java . . . . . . . . . . . . . . . Использование Eclipse . . . . . . . . . . . . . . . . . . . . . . . . Создание исходников . . . . . . . . . . . . . . . . . . . . . . Интерфейс . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Запуск примеров . . . . . . . . . . . . . . . . . . . . . . . . . Сборка примеров в Ant-Based. . . . . . . . . . . . . . . . . Отдельные примеры. . . . . . . . . . . . . . . . . . . . . . . Функции Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . Создание ярлыков . . . . . . . . . . . . . . . . . . . . . . . . Автоматическая коррекция . . . . . . . . . . . . . . . . . . Реорганизация кода . . . . . . . . . . . . . . . . . . . . . . . Сравнение файлов . . . . . . . . . . . . . . . . . . . . . . . . Организация импорта. . . . . . . . . . . . . . . . . . . . . . Форматирование исходного кода . . . . . . . . . . . . . . Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Приложение Б. BeanShell: Написание сценариев Java . . . . . . Запуск BeanShell . . . . . . . . . . . . . . . . . . . . . . . . . . . . Операторы и выражения Java . . . . . . . . . . . . . . . . . . . . Импорт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Команды BeanShell . . . . . . . . . . . . . . . . . . . . . . . . . . Сценарии методов и объектов . . . . . . . . . . . . . . . . . . . Сценарии интерфейсов и адаптеров . . . . . . . . . . . . . Изменение директории classpath. . . . . . . . . . . . . . . . . . Дополнительные сведения. . . . . . . . . . . . . . . . . . . . . . Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Предметный указатель . . . . . . . . . . . . . . . . . . . . . . . . . .
16
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1132 1132 1134 1135 1136 1138 1138 1139 1140 1141 1142 1144 1145 1146 1146 1147 1149 1154 1157 1157 1164 1164 1165 1166 1168 1170 1172 1172 1173 1174 1175 1175 1176 1177 1178 1179 1180 1181 1182 1182 1182 1183 1184 1185 1185 1185 1186 1187 1187 1188 1189 1190 1191 1192 1193 1194 1195 1210 1211
ПРЕДИСЛОВИЕ
Перед вами книга о языке и среде программирования Java. Являетесь ли вы разработчиком программного обеспечения или просто пользуетесь Всемирной паутиной в повседневной жизни, вы, несомненно, слышали о языке Java. Его появление было одной из самых волнующих разработок в истории Всемирной паутины, а приложения языка Java сильно ускорили рост бизнеса во Всемирной паутине за последние 15 лет. Java, пожалуй, самый популярный язык программирования в мире, и его используют миллионы разработчиков на всех мыслимых типах компьютеров. За последнее десятилетие язык Java обогнал такие языки, как C++ и Visual Basic, с точки зрения требований к разработке и фактически стал основным языком для определенных типов разработки, в особенности для сервисов, использующих интернет-технологии. Многие университеты теперь обучают Java на своих начальных курсах вместе с другими важными современными языками. Возможно, в таком университете учитесь и вы… Эта книга преподаст вам основы Java, такие как интерфейсы API. Книга старается соответствовать своему названию, включая описание языка Java и его библиотек классов, техник программирования и идиом. Мы копнем глубоко в интересных областях и по крайней мере поверхностно осветим остальной материал. По возможности мы предлагаем захватывающие, реалистичные и забавные примеры и избегаем простой каталогизации свойств. Примеры незамысловатые, но намекают на то, что еще можно сделать. Мы не будем разрабатывать очередное великое «убийственное приложение» на этих страницах, но надеемся дать вам отправную точку для многих часов экспериментирования и вдохновенной возни, которые приведут вас к созданию такого приложения своими силами.
17
Предисловие
Кому следует читать эту книгу Эта книга создана для специалистов в компьютерной науке, студентов, людей с техническим образованием и финских хакеров. Она предназначена всем, кто хочет попрактиковаться в языке Java, чтобы потом создавать реальные приложения. Эта книга также может рассматриваться как экспресс-курс по объектно-ориентированному программированию, работе с сетями, GUI и XML. При изучении Java вы получите понятие о мощном и практическом подходе к разработке программного обеспечения, начинающемся с глубокого понимания основ языка Java и его интерфейсов API. При поверхностном рассмотрении Java выглядит как язык C или C++, поэтому вы получите небольшое преимущество в работе с этой книгой, если у вас есть какой-то опыт программирования на одном из этих языков. Если у вас нет такого опыта, не беспокойтесь. Не проводите слишком много синтаксических параллелей между языком Java и C или C++. Во многих отношениях Java ведет себя как такие более динамические языки, как Smalltalk и Lisp. Знание другого объектноориентированного языка определенно должно помочь, хотя вам, возможно, придется поменять некоторые представления и отучиться от некоторых привычек. Java значительно проще, чем другие языки, такие как C++ и Smalltalk. Если вы внимательно изучите материал по конкретным примерам и посредством собственных экспериментов, мы думаем, вам понравится эта книга. Последняя часть этой книги посвящена обсуждению Java в контексте веб-приложений, веб-сервисов и обработки XML, поэтому вы должны быть знакомы с базовыми понятиями о веб-браузерах, сервисах и документации.
Новые разработки Это издание на самом деле является шестым — усовершенствованным и переименованным — после выхода оригинальной популярной книги Learning Java. С каждым изданием мы заботились не только о добавлении нового материала, охватывающего дополнительные свойства, но и о тщательной проверке и обновлении существующего содержания, чтобы объединить информацию и добавить плоды накопленного за годы фактического опыта к этим страницам. Значи-
18
Предисловие
тельным изменением в последних изданиях является то, что мы уделили меньшее значение использованию апплетов, отражая их меньшую роль в создании интерактивных веб-страниц в последние годы. С другой стороны, мы значительно расширили информацию о вебприложениях Java, веб-сервисах и XML, которые являются развитыми технологиями. Мы рассмотрели все важные свойства выпуска Java Standard Edition (SE) 7, JDK 1.7 и описали нововведения релиза Java 8. Компания Sun (владелец языка Java до Oracle) неоднократно меняла схему наименования за много лет. Sun придумала термин Java 2, чтобы учесть основные новые изменения, представленные в версии Java 1.2, и ввела термин JDK в пользу SDK. С шестым выпуском Sun перепрыгнула с версии Java 1.4 до версии Java 5.0, но дала отсрочку термину JDK и оставила свою систему нумерации. После этого у нас появился язык Java 6, и теперь мы добрались до Java 7 и 8. Этот выпуск Java демонстрирует зрелый язык с относительно малыми синтаксическими изменениями, но значительными обновлениями интерфейсов API и библиотек. Мы попытались охватить эти новые свойства и обновить каждый пример в этой книге, чтобы отразить не только современные приемы Java, но и стиль.
Новое в этом издании Это значительно переработанное, наиболее полное и современное издание. Оно включает изменения из выпусков Java 6, 7 и 8, которые произошли с последнего издания этой книги. Новые темы этого издания включают: •
новые свойства языка, в том числе вывод типа в обобщениях и улучшенную обработку исключений и автоматический синтаксис управления ресурсами;
•
новые утилиты параллельности, включая фреймворк разветвлениясоединения;
•
новую NIO Files API, которая позволяет реализацию новых типов доступа к файловой системе в Java;
•
новые версии Java Servlets API (3.0) и API веб-сервисов, включая использование нового размещения, основанного на аннотациях и встроенного контейнера веб-сервисов;
19