Предисловие | 20 |
|
Предисловие ко второму изданию | 22 |
Java 2 | 24 |
|
Введение | 25 |
|
Предпосылки | 25 |
Изучение Java | 26 |
Цели | 27 |
Интерактивная документация | 27 |
Главы | 28 |
Упражнения | 32 |
Мультимедийный компакт-диск | 32 |
Исходные тексты программ | 33 |
Стандарты программирования | 34 |
Версии Java | 34 |
Семинары и преподавание | 35 |
Ошибки | 35 |
Благодарности | 35 |
Помощники из Интернета | 38 |
|
Глава 1 • Введение в объекты | 39 |
|
Развитие абстракции | 40 |
У объекта существует интерфейс | 41 |
Скрытая реализация | 43 |
Многократное использование реализации | 44 |
Наследование: многократное использование интерфейса | 45 |
Сравнение связей «это-есть-то» и «это-схоже-с-тем» | 49 |
Взаимозаменяемые объекты и полиморфизм | 50 |
Абстрактные базовые классы и интерфейсы | 53 |
Место существования и время жизни объектов | 54 |
Коллекции и итераторы | 55 |
Однокоренная иерархия | 57 |
Библиотеки коллекций и поддержка их простого использования | 58 |
Домашняя дилемма: кто убирает? | 59 |
Обработка исключений: борьба с ошибками | 60 |
Многозадачность | 61 |
Постоянство | 62 |
Java и Интернет | 63 |
Что такое сеть WWW? | 63 |
Клиентское программирование | 65 |
Серверное программирование | 71 |
Уединённая арена: приложения | 71 |
Анализ и планирование | 72 |
Этап 0: Создание плана | 74 |
Этап 1: Что мы делаем? | 74 |
Этап 2: Как мы будем это создавать? | 78 |
Этап 3: Создание ядра | 81 |
Этап 4: Перечисление случаев использования | 81 |
Этап 5: Эволюция | 82 |
Планы окупаются | 83 |
Экстремальное программирование | 84 |
Сначала пишем тест | 84 |
Программирование парами | 86 |
Почему Java имеет такой успех | 87 |
Системы легче описывать и понимать | 87 |
Самое быстрое средство достижения цели — библиотеки | 87 |
Обработка ошибок | 87 |
Программирование в большом масштабе | 88 |
Стратегии для переходного периода | 88 |
Рекомендации | 88 |
Возможные препятствия | 90 |
Java или C++? | 92 |
Резюме | 93 |
|
Глава 2 • Всё является объектом | 95 |
|
Вы манипулируете объектами с помощью ссылок | 95 |
Вы должны явно создавать все объекты | 96 |
Где находится хранилище | 97 |
Особый случай: примитивные типы | 98 |
Массивы в Java | 99 |
Вам никогда не придётся удалять объект | 100 |
Область видимости | 100 |
Область видимости объектов | 101 |
Создание новых типов данных: класс | 102 |
Поля и методы | 102 |
Методы, параметры и возвращаемые значения | 104 |
Список параметров | 105 |
Создание программы на Java | 106 |
Видимость имён | 106 |
Использование дополнительных компонентов | 107 |
Ключевое слово static | 107 |
Ваша первая программа на Java | 109 |
Компиляция и выполнение | 111 |
Комментарии и встроенная документация | 111 |
Документация в комментариях | 112 |
Синтаксис | 112 |
Внедрённый HTML | 113 |
@see: обращение к другим классам | 114 |
Знаки документации классов | 114 |
Знаки документации переменных | 115 |
Знаки документации методов | 115 |
Пример документации | 116 |
Стиль программирования | 116 |
Резюме | 117 |
Упражнения | 117 |
|
Глава 3 • Управление ходом программы | 119 |
|
Использование операторов Java | 119 |
Приоритет | 120 |
Присвоение | 120 |
Математические операторы | 122 |
Автоматическое приращение и уменьшение | 124 |
Операторы сравнения | 125 |
Логические операторы | 127 |
Поразрядные операторы | 129 |
Операторы сдвига | 130 |
Тройной оператор «если-то» | 133 |
Оператор-запятая | 134 |
Строковый оператор «+» | 134 |
Обычные ошибки при использовании операторов | 135 |
Операторы приведения | 135 |
В Java отсутствует «sizeof» | 138 |
Таблица приоритета операторов | 138 |
Полное собрание операторов | 139 |
Управление выполнением программы | 147 |
Значения true и false | 147 |
if-else | 148 |
Цикл | 149 |
do-while | 150 |
for | 150 |
Ключевые слова break и continue | 151 |
switch | 157 |
Резюме | 160 |
Упражнения | 161 |
|
Глава 4 • Инициализация и завершение | 162 |
|
Конструктор гарантирует инициализацию | 162 |
Перегрузка методов | 164 |
Различение перегруженных методов | 166 |
Перегрузка с примитивными типами | 167 |
Перегрузка и возвращаемые значения | 170 |
Конструкторы по умолчанию | 171 |
Ключевое слово this | 171 |
Завершение: удаление и сборка мусора | 174 |
Для чего предназначен метод finalize()? | 176 |
Вы должны проводить завершающие действия | 176 |
Условие смерти | 180 |
Как работает сборщик мусора | 181 |
Инициализация членов класса | 184 |
Указание явной инициализации | 186 |
Инициализация конструктором | 187 |
Инициализация массивов | 193 |
Многомерные массивы | 197 |
Резюме | 199 |
Упражнения | 200 |
|
Глава 5 • Сокрытие реализации | 202 |
|
Пакет: элемент библиотеки | 203 |
Создание уникальных имён пакетов | 205 |
Библиотека инструментов | 208 |
Использование импорта для изменения поведения | 209 |
Предостережение при работе с пакетами | 211 |
Спецификаторы доступа Java | 211 |
«Дружественный» | 212 |
public: доступ к интерфейсу | 213 |
private: этого трогать нельзя! | 214 |
protected: что-то вроде «дружественного доступа» | 215 |
Интерфейс и реализация | 216 |
Доступ к классам | 218 |
Резюме | 220 |
Упражнения | 222 |
|
Глава 6 • Многократное использование классов | 224 |
|
Синтаксис композиции | 225 |
Синтаксис наследования | 228 |
Инициализация базового класса | 230 |
Сочетание композиции и наследования | 232 |
Обеспечение правильного завершения | 233 |
Сокрытие имён | 236 |
Выбор между композицией и наследованием | 237 |
protected | 238 |
Пошаговая разработка | 239 |
Восходящее преобразование типов | 240 |
Почему «восходящее преобразование»? | 241 |
Ключевое слово final | 242 |
Неизменные данные | 242 |
Неизменные методы | 246 |
Неизменные классы | 248 |
Предупреждение при работе с final | 249 |
Инициализация и загрузка классов | 249 |
Инициализация с наследованием | 250 |
Резюме | 251 |
Упражнения | 252 |
|
Глава 7 • Полиморфизм | 254 |
|
Восходящее преобразование: пересмотр | 255 |
Игнорирование типа объекта | 256 |
Трюк | 257 |
Связывание метод-вызов | 257 |
Получение нужного результата | 258 |
Расширяемость | 261 |
Переопределение против перегрузки | 263 |
Абстрактные классы и методы | 265 |
Конструкторы и полиморфизм | 268 |
Порядок вызова конструкторов | 268 |
Наследование и метод finalize() | 270 |
Действие полиморфных методов при вызове из конструкторов | 273 |
Использование наследования | 275 |
Чистое наследование в сравнении с расширением | 277 |
Нисходящее преобразование и динамическое определение типов | 278 |
Резюме | 280 |
Упражнения | 281 |
|
Глава 8 • Интерфейсы и внутренние классы | 283 |
|
Интерфейсы | 284 |
«Множественное наследование» в Java | 286 |
Расширение интерфейса с помощью наследования | 290 |
Группировка констант | 291 |
Инициализация полей интерфейсов | 292 |
Внутренние классы | 293 |
Внутренние классы и восходящее преобразование | 295 |
Внутренние классы в методах и областях видимости | 297 |
Безымянные внутренние классы | 299 |
Связь с внешним классом | 301 |
Статические внутренние классы | 303 |
Обращение к объекту внешнего класса | 305 |
Вложенные интерфейсы | 306 |
Использование внешнего окружения из внутреннего класса произвольного |
уровня вложенности | 309 |
Наследование от внутренних классов | 310 |
Можно ли переопределить внутренний класс? | 310 |
Идентификаторы внутренних классов | 312 |
Какой смысл во внутренних классах? | 313 |
Внутренние классы и система управления | 317 |
Резюме | 324 |
Упражнения | 324 |
|
Глава 9 • Хранение ваших объектов | 327 |
|
Массивы | 328 |
Массивы — это первоклассные объекты | 329 |
Возвращение массива | 332 |
Класс Arrays | 333 |
Заполнение массива | 343 |
Копирование массива | 344 |
Сравнение массивов | 345 |
Сравнения элементов массива | 345 |
Сортировка массива | 348 |
Поиск в отсортированном массиве | 350 |
Массивы: резюме | 351 |
Введение в контейнеры | 352 |
Печать контейнеров | 353 |
Заполнение контейнеров | 354 |
Недостаток контейнеров: неизвестный тип | 358 |
Иногда это всё равно работает | 360 |
Создание контейнера ArrayList для определённого типа | 361 |
Итераторы | 362 |
Классификация контейнеров | 366 |
Функциональность коллекций Collection | 368 |
Функциональность списков List | 371 |
Создание стека на основе списка LinkedList | 374 |
Создание очереди на основе списка LinkedList | 375 |
Функциональность множества Set | 376 |
Отсортированное множество SortedSet | 378 |
Функциональность таблицы Map | 378 |
Отсортированная таблица SortedMap | 382 |
Хэширование и хэш-код | 383 |
Переопределение метода hashCode() | 390 |
Хранение ссылок | 393 |
Таблица WeakHashMap | 395 |
Итераторы: ещё один взгляд | 396 |
Выбор реализации | 397 |
Выбор списка List | 398 |
Выбор множества Set | 401 |
Выбор таблицы Map | 403 |
Сортировка и поиск в списках List | 405 |
Инструменты | 406 |
Получение неизменных коллекций и таблиц | 407 |
Синхронизация коллекции или таблицы | 408 |
Неподдерживаемые операции | 409 |
Контейнеры языка Java версий 1.0/1.1. | 412 |
Vector и Enumeration | 412 |
Hashtable | 413 |
Stack | 413 |
BitSet | 414 |
Резюме | 416 |
Упражнения | 416 |
|
Глава 10 • Обработка ошибок и исключения | 421 |
|
Основные исключения | 422 |
Параметры при создании исключения | 423 |
Обработка исключения | 424 |
Блок try | 424 |
Обработчики исключений | 425 |
Создание собственных исключений | 426 |
Описание исключений | 429 |
Перехват любого типа исключения | 430 |
Повторное возбуждение исключения | 432 |
Стандартные исключения Java | 435 |
Особый случай — RuntimeException | 435 |
Осуществление завершающих действий с помощью предложения finally | 437 |
Для чего нужно finally? | 438 |
Ловушка: потерянное исключение | 441 |
Ограничения исключений | 442 |
Конструкторы | 445 |
Соответствие исключений | 448 |
Исключения: полезные советы и рекомендации | 449 |
Резюме | 449 |
Упражнения | 450 |
|
Глава 11 • Система ввода/вывода Java | 452 |
|
Класс File | 453 |
Список директорий | 453 |
Создание директорий | 456 |
Ввод и вывод | 458 |
Разновидности входных потоков InputStream | 459 |
Разновидности выходных потоков OutputStream | 460 |
Добавление новых свойств и полезных интерфейсов | 461 |
Чтение из входного потока InputStream с помощью надстройки |
FilterlnputStream | 462 |
Запись в выходной поток OutputStream с помощью надстройки |
FilterOutputStream | 463 |
Классы для чтения и записи данных — Reader и Writer | 464 |
Источники и приёмники данных | 465 |
Изменение поведения потока | 465 |
Классы, оставленные без изменений | 466 |
Сам по себе: класс RandomAccessFile | 467 |
Типичное использование потоков ввода/вывода | 467 |
Входные потоки | 470 |
Выходные потоки | 472 |
Ошибка? | 473 |
Каналы | 474 |
Стандартный ввод/вывод | 474 |
Чтение стандартного ввода | 475 |
Надстройка PrintWriter для стандартного вывода | 475 |
Перенаправление стандартного ввода/вывода | 476 |
Сжатие данных | 477 |
Простое сжатие алгоритмом GZIP | 478 |
Сжатие файлов в формате Zip | 478 |
Архивы Java ARchives (JARs) | 481 |
Сериализация объектов | 482 |
Нахождение класса | 486 |
Управление процессом сериализации | 487 |
Использование постоянства | 495 |
Разбитие входных данных | 502 |
StreamTokenizer | 502 |
StringTokenizer | 504 |
Проверка правильности написания имён | 506 |
Резюме | 514 |
Упражнения | 515 |
|
Глава 12 • Динамическое определение типов | 517 |
|
Необходимость в динамическом определении типов (RTTI) | 517 |
Объект Class | 520 |
Проверка перед преобразованием . | 522 |
Синтаксис RTTI | 529 |
Отражение: динамическая информация о классе | 531 |
Информация о методах класса | 533 |
Резюме | 537 |
Упражнения | 538 |
|
Глава 13 • Создание окон и апплетов | 540 |
|
Простой апплет | 543 |
Ограничения апплетов | 543 |
Преимущества апплетов | 544 |
Каркасы приложения | 544 |
Запуск апплетов в Web-броузере | 546 |
Использование инструмента Appletviewer | 547 |
Тестирование апплетов | 548 |
Запуск апплетов из командной строки | 549 |
Инструмент для показа программ на экране | 551 |
Использование Проводника Windows | 553 |
Делаем кнопку | 554 |
Обработка события | 555 |
Многострочные текстовые поля | 558 |
Управление расположением компонентов | 559 |
Полярное расположение BorderLayout | 560 |
Последовательное расположение FlowLayout | 561 |
Табличное расположение GridLayout | 561 |
Расположение GridBagLayout | 562 |
Абсолютное расположение | 562 |
Блочное расположение BoxLayout | 563 |
Лучший вариант? | 566 |
Модель событий библиотеки Swing | 567 |
Типы событий и слушателей | 567 |
Обработка нескольких событий одновременно | 573 |
Каталог компонентов библиотеки Swing | 576 |
Кнопки | 576 |
Значки | 579 |
Подсказки | 581 |
Текстовые поля | 581 |
Рамки | 583 |
Панель прокрутки JScrollPane | 584 |
Мини-редактор | 586 |
Флажки | 587 |
Переключатели | 588 |
Комбинированные (выпадающие) списки | 589 |
Списки | 590 |
Панель вкладок | 592 |
Окна сообщений | 593 |
Меню | 595 |
Всплывающие меню | 600 |
Рисование | 602 |
Диалоговые окна | 604 |
Окно списка файлов | 608 |
Использование HTML для компонентов Swing | 610 |
Ползунки и индикаторы выполнения | 611 |
Деревья | 612 |
Таблицы | 614 |
Выбор внешнего вида и поведения программы | 616 |
Буфер обмена | 618 |
Упаковка апплета в файл формата JAR | 621 |
Техника программирования | 621 |
Динамическое связывание событий | 622 |
Разделение вычислений и пользовательского интерфейса | 623 |
Каноническая форма | 626 |
Визуальное программирование и компоненты JavaBeans | 626 |
Что такое компонент Bean? | 628 |
Получение информации о компоненте Bean с помощью инструмента |
Introspector | 630 |
Более сложный компонент Bean | 635 |
Упаковка компонента Bean | 638 |
Поддержка более сложных компонентов Bean | 640 |
Больше о компонентах Bean | 641 |
Резюме | 641 |
Упражнения | 642 |
|
Глава 14 • Многозадачность | 645 |
|
Чуткие пользовательские интерфейсы | 646 |
Наследование от потока Thread | 648 |
Использование потоков для создания чуткого интерфейса | 650 |
Совмещение потока с основным классом | 652 |
Создание произвольного количества потоков | 654 |
Потоки-демоны | 657 |
Совместное использование ограниченных ресурсов | 659 |
Неверный доступ к ресурсам | 659 |
Как Java разделяет ресурсы | 663 |
Компоненты JavaBeans: ещё один взгляд | 668 |
Блокировка | 672 |
Переход в блокированное состояние | 672 |
Тупик | 682 |
Приоритеты | 686 |
Чтение и установка приоритетов | 686 |
Группы потоков | 690 |
Ещё раз об интерфейсе Runnable | 697 |
Слишком много потоков | 700 |
Резюме | 703 |
Упражнения | 705 |
|
Глава 15 • Распределённое программирование | 707 |
|
Сетевое программирование | 708 |
Идентификация машины | 708 |
Разъёмы | 712 |
Обслуживание произвольного количества клиентов | 718 |
Дейтаграммы | 723 |
Использование адресов URL из апплета | 723 |
Больше о сети | 726 |
Java и базы данных (интерфейс JDBC) | 726 |
Как сделать пример работоспособным | 729 |
Программа поиска с графическим пользовательским интерфейсом | 733 |
Почему интерфейс JDBC кажется таким сложным | 735 |
Более интересный пример | 735 |
Сервлеты | 742 |
Простой сервлет | 743 |
Сервлеты и многозадачность | 747 |
Обработка сеансов | 748 |
Запуск примеров-сервлетов | 752 |
Серверные страницы Java (JSP) | 752 |
Встроенные объекты | 754 |
Директивы страниц JSP | 755 |
Элементы сценариев страниц JSP | 755 |
Извлечение полей и значений | 757 |
Параметры и области видимости страниц JSP | 758 |
Страницы JSP и манипуляция сеансами | 759 |
Создание и модификация файлов cookie | 761 |
Серверные страницы JSP: резюме | 762 |
Удалённый вызов методов (RMI) | 762 |
Удалённые интерфейсы | 763 |
Реализация удалённого интерфейса | 764 |
Создание заглушек и каркасов | 766 |
Использование удалённого объекта | 767 |
CORBA | 768 |
Основы CORBA | 769 |
Пример | 770 |
Апплеты Java и архитектура CORBA | 775 |
CORBA в сравнении с RMI | 775 |
Технология Enterprise JavaBeans | 776 |
Сравнение компонентов JavaBeans и EJBs | 777 |
Спецификация EJB | 778 |
Компоненты EJB | 778 |
Составные части компонента EJB | 780 |
Действие EJB | 781 |
Типы компонентов EJB | 781 |
Разработка компонента EJB | 783 |
Компоненты EJB: резюме | 787 |
Jini: распределённые услуги | 787 |
Jini в контексте | 787 |
Что такое Jini? | 788 |
Как работает Jini | 789 |
Процесс обнаружения | 789 |
Процесс соединения | 790 |
Процесс поиска | 790 |
Разделение интерфейса и реализации | 791 |
Абстрагирование распределённых систем | 792 |
Резюме | 793 |
Упражнения | 793 |
|
Приложение А • Передача и возвращение объектов | 796 |
|
Передача ссылок | 797 |
Совмещение имён | 797 |
Создание локальных копий | 799 |
Передача по значению | 800 |
Клонирование объектов | 800 |
Добавление к классу возможности клонирования | 802 |
Успешное клонирование | 804 |
Действие метода Object.clone() | 806 |
Клонирование составного объекта | 808 |
Глубокое копирование списка ArrayList | 809 |
Глубокое копирование сериализацией | 811 |
Добавление клонируемости далее по иерархии | 813 |
Почему всё сделано так странно? | 814 |
Управление клонированием | 814 |
Конструктор-копировщик | 819 |
Классы «только для чтения» | 823 |
Создание классов «только для чтения» | 824 |
Недостаток неизменяемости | 825 |
Неизменные строки String | 827 |
Классы String и StringBuffer | 830 |
Строки String необычны | 832 |
Резюме | 833 |
Упражнения | 834 |
|
Приложение Б • Java Native Interface (JNI) | 836 |
|
Вызов родного метода | 837 |
Генератор заголовочных файлов: javah | 838 |
Искажение имён и обозначения функций | 838 |
Реализация библиотеки DLL | 839 |
Доступ к функциям JNI: параметр JNIEnv | 840 |
Доступ к строкам | 841 |
Передача и использование объектов | 841 |
Интерфейс JNI и исключения | 843 |
Интерфейс JNI и многозадачность | 844 |
Использование уже существующего кода | 844 |
Дополнительная информация | 845 |
|
Приложение В • Рекомендации по программированию |
на Java | 846 |
|
Проектирование | 846 |
Реализация | 852 |
|
Приложение Г • Рекомендованная литература | 858 |
|
Программные средства | 858 |
Книги | 858 |
Анализ и планирование | 860 |
Язык Python | 862 |
Список моих собственных книг | 862 |
|
Алфавитный указатель | 864 |