Предисловие
Предисловие к третьему изданию
Java 2, JDK 1.4
Комментарии читателей
О книге Thinking in C++
От издательства
Введение
Предпосылки
Изучение Java
Цели
HTML-документация JDK

Главы
Упражнения
Исходные тексты программ
Стандарты кодирования
Версии Java
Ошибки
Замечания о дизайне обложки
Благодарности

Глава 1. Введение в объекты
Развитие абстракции
Объект имеет интерфейс
Объект предоставляет услуги
Скрытая реализация
Повторное использование реализации
Наследование: повторное использование интерфейса
Отношение "является" в сравнении с "похоже"
Взаимозаменяемые объекты и полиморфизм
Абстрактные базовые классы и интерфейсы
Создание, использование объектов и время их жизни
Коллекции и итераторы
Однокорневая иерархия
Нисходящее преобразование и шаблоны/обобщенные типы
Гарантии надлежащей "приборки"
Обработка исключений: борьба с ошибками
Параллельное выполнение
Хранение
Java и Интернет
Что такое Web?
Вычисления "клиент-сервер"
Web как гигантский сервер
Программирование на стороне клиента
Программирование на стороне сервера
Приложения
Почему Java имеет такой успех
Системы легче описывать и понимать
Максимум отдачи - библиотеки
Обработка ошибок
Программирование по-крупному
Java или C++?
Резюме

Глава 2. Все является объектом
Вы управляете объектами посредством ссылок
Вы должны явно создавать все объекты
Где находится хранилище
Особый случай: простейшие типы
Массивы в Java
Вам никогда не придется удалять объект
Ограничение области действия
Область действия объектов
Создание новых типов данных: класс
Поля и методы
Методы, аргументы и возвращаемые значения
Список аргументов
Создание программы на Java
Видимость имен
Использование внешних компонентов
Ключевое слово static
Ваша первая программа на Java
Компиляция и выполнение
Комментарии и встроенная документация
Документация в комментариях
Синтаксис
Встроенный HTML
Примеры некоторых тегов
Пример документации
Стиль оформления программ
Резюме
Упражнения

Глава 3. Управление течением программы
Использование операторов Java
Приоритет
Присвоение
Арифметические операторы
Автоувеличение и автоуменьшение
Операторы сравнения
Логические операторы
Поразрядные операторы
Операторы сдвига
Трехчленный оператор "если-то"
Оператор-запятая
Строковый оператор +
Типичные ловушки при использовании операторов
Операторы приведения
В Java отсутствует sizeof
Снова о приоритетах
Операторы: резюме
Управление выполнением программы
true и false
if-else
return
Повторения
do-while
for
break и continue
switch
Резюме
Упражнения

Глава 4. Инициализация и завершение
Конструктор гарантирует инициализацию
Перегрузка методов
Различение перегруженных методов
Перегрузка с примитивами
Перегрузка по возвращаемым значениям
Конструкторы по умолчанию
Ключевое слово this
Очистка: финализация и сборка мусора
Для чего нужен метод finalize()?
Очистка - ваш долг
Условие "готовности"
Как работает сборщик мусора
Инициализация членов класса
Указание инициализации
Инициализация конструктором
Инициализация массивов
Многомерные массивы
Резюме
Упражнения

Глава 5. Сокрытие реализации
Пакет: библиотечный модуль
Создание уникальных имен пакетов
Библиотека инструментов пользователя
Использование импорта для изменения поведения
Предостережение при работе с пакетами
Спецификаторы доступа Java
Доступ в пределах пакета
public: доступ к интерфейсу
private: "руками не трогать!"
protected: доступ при наследовании
Интерфейс и реализация
Доступ к классам
Резюме
Упражнения

Глава 6. Повторное использование классов
Синтаксис композиции
Синтаксис наследования
Инициализация базового класса
Сочетание композиции и наследования
Обеспечение правильного завершения
Сокрытие имен
Композиция в сравнении с наследованием
protected
Пошаговая разработка
Восходящее преобразование типов
Почему "восходящее преобразование"?
Ключевое слово final
Неизменные данные
Неизменные методы
Неизменные классы
Предостережение
Инициализация и загрузка классов
Инициализация с наследованием
Резюме
Упражнения

Глава 7. Полиморфизм
Восходящее преобразование: пересмотр
"Забывание" типа объекта
Особенности
Связывание "метод-вызов"
Получение нужного результата
Расширяемость
Ловушка: "переопределение" закрытых методов
Абстрактные классы и методы
Конструкторы и полиморфизм
Порядок вызова конструкторов
Наследование и завершающие действия
Поведение полиморфных методов при вызове из конструкторов
Разработка с наследованием 280
"Чистое" наследование в сравнении с расширением
Нисходящее преобразование и динамическое определение типов
Резюме
Упражнения

Глава 8. Интерфейсы и внутренние классы
Интерфейсы
"Множественное наследование" в Java
Расширение интерфейса через наследование
Группировка констант
Инициализация полей интерфейсов
Вложенные интерфейсы
Внутренние классы
Внутренние классы и восходящее преобразование
Внутренние классы в методах и областях действия
Безымянные внутренние классы
Связь с внешним классом
Вложенные классы
Обращение к объекту внешнего класса
Доступ вовне из многократно вложенных классов
Наследование от внутренних классов
Можно ли переопределить внутренний класс?
Локальные внутренние классы
Идентификаторы внутренних классов
Внутренние классы: зачем?
Замыкания и обратные вызовы
Внутренние классы и система управления
Резюме
Упражнения

Глава 9. Обработка ошибок и исключения
Основные исключения
Аргументы исключения
Перехват исключений
Блок try
Обработчики исключений
Создание собственных исключений
Описание исключений
Перехват любого типа исключения
Повторное возбуждение исключения
Цепочки исключений
Стандартные исключения Java
Особый случай: RuntimeException
Завершение с помощью finally
Для чего нужно finally?
Ловушка: потерянное исключение
Ограничения исключений
Конструкторы
Отождествление исключений
Альтернативные подходы
Предыстория
Перспективы
Передача исключений на консоль
Преобразование контролируемых исключений в неконтролируемые
Исключения: руководящие принципы
Резюме
Упражнения

Глава 10. Определение типов
Необходимость в динамическом определении типов (RTTI)
Объект Class
Проверка перед приведением типов
Синтаксис RTTI
Отражение: динамическая информация о классе
Извлечение информации о методах класса
Резюме
Упражнения

Глава 11. Коллекции объектов
Массивы
Массивы - это первоклассные объекты
Возврат массива
Класс Arrays
Заполнение массива
Копирование массива
Сравнение массивов
Сравнения элементов массива
Сортировка массива
Поиск в отсортированном массиве
Массивы: резюме
Введение в контейнеры
Распечатка контейнеров
Заполнение контейнеров
Неудобство контейнеров: неизвестный тип
Иногда это все равно работает
Создание контейнера ArrayList для определенного типа
Итераторы
Таксономия контейнеров
Функциональность коллекций
Функциональность списков
Создание стека на основе списка LinkedList
Создание очереди на основе списка LinkedList
Функциональность множества
SortedSet
Функциональность карты
SortedMap
LinkedHashMap
Хэширование и хэш-коды
Переопределение hashCode()
Удержание ссылок
WeakHashMap
Итераторы: еще один взгляд
Выбор реализации
Выбор между списками
Выбор между множествами
Выбор между картами
Сортировка и поиск в списках
Инструменты
Получение неизменяемых коллекций и карт
Синхронизация коллекции или карты
Неподдерживаемые операции
Контейнеры Java версий 1.0/1.1
Vector и Enumeration
Hashtable
Stack
BitSet
Резюме
Упражнения

Глава 12. Система ввода- вывода Java
Класс File
Список каталогов
Создание каталогов
Ввод и вывод
Типы InputStream
Типы OutputStream
Добавление свойств и интерфейсов
Чтение из InputStream с помощью FilterInputStream
Запись в OutputStream с помощью FilterOutputStream
Классы Reader и Writer
Источники и приемники данных
Изменение поведения потока
Классы, оставленные без изменений
RandomAccessFile: сам по себе
Типичное использование потоков ввода-вывода
Входные потоки
Выходные потоки
Каналы
Инструменты для чтения и записи файлов
Стандартный ввод-вывод
Чтение из стандартного потока ввода

Подмена System.in на PrintWriter Перенаправление стандартного ввода-вывода
Новый ввод-вывод (nio)
Преобразование данных
Извлечение примитивов
Представления буферов
Буферы и манипуляция данными
Подробно о буфере
Отображаемые в память файлы
Блокировка файлов
Сжатие данных
Простое сжатие в формате GZIP
Многофайловые архивы ZIP
Архивы Java ARchives (файлы JAR)
Сериализация объектов
Обнаружение класса
Управление сериализацией
Долговременное хранение
Предпочтения
Регулярные выражения
Создание регулярных выражений
Квантификаторы
Pattern и Matcher
split()
Операции замещения
reset()
Регулярные выражения и ввод-вывод
Нужен ли StringTokenizer?
Резюме
Упражнения

Глава 13. Параллельное выполнение
Мотивация
Простые потоки
Уступки
Ожидание
Приоритет
Потоки-демоны
Присоединение к потоку
Варианты кодирования
Чуткие пользовательские интерфейсы
Совместное использование ресурсов
Некорректный доступ к ресурсам
Состязание за ресурсы
Разрешение спора за разделяемые ресурсы
Критические секции
Состояния потока
Переход в блокированное состояние
Сотрудничество потоков
Ожидание и уведомление
Использование каналов для ввода-вывода между потоками
Более сложное взаимодействие
Тупики
Правильный способ остановки
Воздействие на блокированный поток
Группы потоков
Резюме
Упражнения

Глава 14. Создание окон и апплетов
Простой апплет
Ограничения апплетов
Преимущества апплетов
Каркасы приложений
Запуск апплетов в браузере
Использование Appletviewer
Тестирование апплетов
Запуск апплетов из командной строки
Отображение апплетов на экране
Делаем кнопку
Перехват событий
Многострочные текстовые поля
Управление расположением компонентов
BorderLayout
FlowLayout
GridLayout
GridBagLayout
Абсолютное позиционирование
BoxLayout
Лучший вариант?
Модель событий библиотеки Swing
Типы событий и слушателей
Отслеживание ряда событий
Компоненты Swing
Кнопки
Значки
Подсказки
Текстовые поля
Рамки
Панель JScrollPane
Мини-редактор
Флажки
Переключатели
Раскрывающиеся списки
Списки
Панель вкладок
Окна сообщений
Меню
Всплывающие меню
Рисование
Диалоговые окна
Диалог выбора файлов
HTML для компонентов Swing
Регуляторы и индикаторы выполнения
Деревья
Таблицы
Выбор внешнего вида и поведения программы
Буфер обмена
Упаковка апплета в файл JAR
Подписывание апплетов
JNLP и Java Web Start
Техника программирования
Динамическое закрепление событий
Разделение бизнес-правил и логики графического интерфейса
Каноническая форма
Параллельное выполнение и Swing
Интерфейс Runnable: еще один взгляд
Управление параллельным выполнением
Визуальное программирование и компоненты JavaBean
Что такое компонент JavaBean?
Получение информации о компоненте Bean: инструмент Introspector
Более сложный компонент Bean
Компоненты JavaBean и синхронизация
Упаковка компонента Bean
Поддержка более сложных компонентов Bean
Больше о компонентах Bean
Резюме
Упражнения

Глава 15. Обнаружение проблем
Модульное тестирование
Простая инфраструктура тестирования
JUnit
Повышение надежности посредством утверждений
Синтаксис
Контроль при проектировании по контракту
Пример: DBC + тестирование "белого" ящика
Сборка инструментом Ant
Автоматизируйте все
Проблемы с make
Ant: неофициальный стандарт
Контроль версий посредством CVS
Ежедневные сборки
Журнализация
Уровни журнализации
Записи LogRecord
Объекты Handler
Фильтры
Объекты Formatter
Пример: посылка электронного письма для вывода сообщений
Управление уровнями журнализации через пространство имен
Практика журнализации для больших проектов
Заключение
Отладка
Отладка с помощью JDB
Графические отладчики
Профилировка и оптимизация
Слежение за потреблением памяти
Статистика загрузки процессора
Тесты на область охвата
Интерфейс профилировки JVM
Использование HPROF
Производительность потоков
Рекомендации по оптимизации
Доклеты
Резюме
Упражнения

Глава 16. Анализ и планирование
Методология
Этап 0. Создание плана
Формулировка задания
Этап 1. Что мы делаем?
Этап 2. Как мы будем это создавать?
Пять ступеней создания объекта
Руководящие принципы по разработке объектов
Этап 3. Создание ядра
Этап 4. Случаи использования
Этап 5. Эволюция
Планы окупаются
Экстремальное программирование
Сначала пишем тест
Программирование парами
Стратегии для переходного периода
Рекомендации
Возможные препятствия
Заключение

Приложение А. Передача и возврат объектов
Передача ссылок
Совмещение имен
Создание локальных копий
Передача по значению
Клонирование объектов
Добавление к классу способности клонирования
Успешное клонирование
Действие Object.clone()
Клонирование составного объекта
Глубокое копирование списка ArrayList
Глубокое копирование через сериализацию
Добавление клонируемости вниз по иерархии
Почему все сделано так странно?
Управление клонированием
Конструктор-копировщик
Классы "только для чтения"
Создание классов "только для чтения"
Издержки неизменяемости
Неизменные строки
Классы String и StringBuffer
Строки String специфичны
Резюме
Упражнения

Приложение Б. Рекомендации по программированию на Java
Проектирование
Реализация
Приложение В o Дополнения
Компакт-диск с курсом Hands-On Java, 3-е издание
Семинар "Разработка Объектов и Систем"
Thinking In Enterprise Java
Семинар по J2EE
Thinking In Patterns with Java
Семинар Thinking In Patterns
Консультации по планированию и обсуждение проектов
Приложение Г. Ресурсы
Программные средства
Книги
Анализ и планирование
Python
Список моих собственных книг
Алфавитный указатель