Thinking in Java, 2nd ed. Revision 11 - Contents
Thinking in Java, 2nd ed. Revision 11 - Title Page
Предисловие
Предисловие ко 2-му изданию
Java 2
CD ROM
Введение
Предпосылки
Изучение Java
Цели
Online документация
Главы
Упражнения
Мультимедийный CD ROM
Исходный код
Условные обозначения
Версии Java
Семинары и сопровождение
Ошибки
О дизайне обложки книги
Благодарности
Помощники в Интернет
1: Введение в объекты
Развитие абстракции
Объект имеет интерфейс
Спрятанная реализация
Повторное использование реализации
Наследование: повторное использование интерфейса
Отношения ЯВЛЯЕТСЯ против ПОХОЖ НА
Взаимозаменяемые объекты с полиморфизмом
Абстрактные базовые классы и интерфейсы
Видимость и время жизни объектов
Сборщики и итераторы
Простая корневая иерархия
Собрание библиотек и поддержка для облегчения использования собрания
Нисхождение против шаблонов/настроек
Дилемма домоводства: кто должен убирать?
Сборщик мусора против эффективности и гибкости
Обработка исключений: работа с ошибками
Многопоточность
Живучесть
Java и Internet
Что такое Web?
Клиент/Серверные вычисления
Web - как гигантский сервер
Программирование клиентской стороны
Plug-ins
Языки сценариев
Java
ActiveX
Безопасность
Internet против intranet
Программирование стороны сервера
Разделенная арена: приложения
Анализ и дизайн
Фаза 0: Создание плана
Задающее утверждение
Фаза 1: Что мы делаем?
Фаза 2: Как мы это построим?
Пять стадий дизайна объектов
Руководство для разработки объектов
Фаза 3: Построение ядра
Фаза 4: Итерации использования причин
Фаза 5: Эволюция
План выплат
Экстремальное программирование
Первичное написание тестов
Парное программирование
Почему Java имеет успех
Система легче для выражения и понимания
Максимум рычагов управления библиотеками
Обработка ошибок
Программирование большого
Стратегии перехода
Руководящие принципы
1. Тренировка
2. Проекты низкого риска
3. Модель успеха
4. Использование библиотек существующих классов
5. Не переписывайте существующий в Java код
Помехи управления
Начальная стоимость
Проблемы производительности
Общие ошибки дизайна
Java против C++?
Резюме
2: Все есть объекты
Вы управляете объектами через ссылки
Вы должны создавать все объекты
Где живет хранилище
Особый случай: примитивные типы
Числа высокой точности
Массивы в Java
Вам никогда не нужно уничтожать объекты
Ограничивание
Границы объектов
Создание новых типов данных: классов
Поля и методы
Значения по умолчанию для примитивных членов
Методы, аргументы и возвращаемое значение
Список аргументов
Построение Java программы
Видимость имен
Использование других компонентов
Ключевое слово static
Ваша первая Java программа
Компиляция и запуск
Коментарии и встроенная документация
Коментарии документации
Синтаксис
Вставка HTML
@see: ссылка на другой класс
Ярлыки документации класса
@version
@author
@since
Ярлыки документации переменных
Ярлыки документации методов
@param
@return
@throws
@deprecated
Пример документации
Стиль кодирования
Резюме
Упражнения
3: Управление течением программы
Использование операторов Java
Предшествование
Присваение
Эффект наложения при вызове методов
Математические операторы
Операторы унарного минуса и плюса
Автоинкремент и автодекремент
Операторы сравнения
Проверка равенства объектов
Логические операторы
Короткое замыкание
Битовые операторы
Операторы сдвига
Тернарный оператор if-else
Оператор запятая
String: оператор +
Общие ловушки при использовании операторов
Операторы приведения
Литералы
Повышение
В Java нет “sizeof”
Снова о предшествовании
Руководство по операторам
Контроль за выполнением
true и false
if-else
return
Итерации
do-while
for
Оператор запятая
break и continue
Имеющий дурную славу “goto”
switch
Детали расчета
Резюме
Упражнения
4: Инициализация и очистка
Гарантированная инициализация при использовании конструктора
Перегрузка методов
Как различать перегруженные методы
Перегрузка с помощью примитивных типов
Перегрузка по возвращаемму значению
Консруктор по умолчанию
Ключевое слово this
Вызов конструктора из конструктора
Смысл static
Очистка: финализация и сборщик мусора
Для чего нужен finalize( )?
Вы должны выполнять очистку
Смертельное состояние
Как работает сборщик мусора
Инициализация членов
Указание инициализации
Инициализация в конструкторе
Порядок инициализации
Инициализация статических данных
Явная инициализация static
Не статическая инициализация экземпляра
Инициализация массива
Многомерные массивы
Резюме
Exercises
5: Скрытие реализации
package: модуль библиотеки
Создание уникальных имен пакетов
Коллизии
Библиотека инструментов пользователя
Использование импорта для изменения поведения
Пакетное предостережение
Спецификаторы доступа в Java
Дружественный доступ “Friendly”
public: интерфейсный доступ
Пакет по умолчанию
private: Вы не можете коснуться этого!
protected: “тип дружественного доступа”
Интерфейс и реализация
Доступ класса
Резюме
Упражнения
6: Повторное использование классов
Синтаксис композиции
Синтаксис наследования
Инициализация базового класса
Конструктор с аргументами
Обработка исключений конструктора
Объединение композиции и наследования
Гарантия правильной очистки
Порядок сборки мусора
Скрытие имен
Выборочная композиция против наследования
protected
Инкрементная разработка
Приведение к базовому типу
Почему “приведение к базовому типу”?
И снова композиция против наследования
Ключевое слово keyword
Данные data
Пустые finals
Аргументы final
Final методы
final и private
Final классы
Предостережение о Final
Инициализация и загрузка классов
Инициализация с наследованием
Резюме
Упражнения
7: Полиморфизм
Повторение приведения к базовому типу
Забывание типа объекта
Скручивание
Связывание метод-вызов
Выработка правильного поведения
Расширяемость
Переопределение против перегрузки
Абстрактные методы и классы
Конструкторы и полиморфизм
Порядок вызова конструкторов
Наследование и finalize( )
Поведение полиморфных методов внутри конструкторов
Проектировка с наследованием
Чистое наследование против расширения
Приведение к дочернему типу и идентификация типов во время работы
Резюме
Упражнения
8: Интерфейсы и внутренние классы
Интерфейсы
Множественное наследование в Java
Конфликты имен при комбинировании интерфейсов
Расширение интерфейса с наследованием
Группировка констант
Инициализирование полей в интерфейсах
Вложенные интерфейсы
Внутренние классы
Внутренний класс и приведение к базовому типу
Внутренние классы в методе и контексте
Анонимный внутренний класс
Связь с внешним классом
static внутренние классы
Ссылки на объект внешнего класса
Доступ "наружу" из множественно вложенных классов
Наследование от внутренних классов
Может ли быть внутренний класс перегружен?
Идентификаторы внутренних файлов
Зачем внутренние классы?
Замыкания & обратные вызовы
Внутренние классы и структуры управления
Резюме
Упражнения
9: Хранение Ваших объектов
Массивы
Массивы - первокалассные объекты
Контейнеры примитивов
Возвращение массива
Класс Arrays
Заполнение массива
Копирование массива
Сравнение массивов
Сравнение элементов массива
Сортировка массива
Поиск в отсортированном массиве
Резюме о массивах
Введение в контейнеры
Распечатка контейнера
Заполнение контейнеров
Неудобство контейнеров: неизвестный тип
Иногда это работает так или иначе
Создание сознающего тип ArrayList
Параметризированные типы
Итераторы
Неумышленная рекурсия
Таксаномия контейнера
Функциональность Collection
Функциональность List
Создание стека из LinkedList
Создание очереди из LinkedList
Функциональность Set
SortedSet
Функциональность Map
SortedMap
Хэширование и хэш коды
Понимание hashCode( )
Фактор производительности HashMap
Перегрузка hashCode( )
Хранение ссылок
The WeakHashMap
Снова об итераторах
Выбор реализации
Выбор между списками (List)
Выбор между множествами (Set)
Выбор между картами (Map)
Сортировка и поиск в списках
Утилиты
Как сделать Collection или Map неизменяемой
Синхронизация Collection или Map
Провалившееся ускорение
Неподдерживаемые операции
Контейнеры Java 1.0/1.1
Vector и Enumeration
Hashtable
Stack
BitSet
Резюме
Упражнения
10: Обработка ошибок с помощью исключений
Основные исключения
Аргументы исключения
Ловля исключения
Блок try
Обработчики исключений
Прерывание против возобновления
Создание ваших собственных исключений
Спецификация исключения
Перехват любого исключения
Повторное выбрасывание исключений
Стандартные исключения Java
Особый случай RuntimeException
Выполнение очистки с помощью finally
Для чего нужно finally?
Ловушка: потерянное исключение
Ограничения исключений
Конструкторы
Совпадение исключений
Руководство по исключениям
Резюме
Упражнения
11: Система ввода/вывода в Java
Класс File
Список директории
Анонимные внутренние классы
Поиск и создание директориев
Ввод и вывод
Типы InputStream
Типы OutputStream
Добавление атрибутов и полезных интерфейсов
Чтение из InputStream с помощью FilterInputStream
Запись в OutputStream с помощью FilterOutputStream
Читающие и пишущие
Источники и приемники данных
Модификация поведения потока
Неизмененные классы
Сам по себе: RandomAccessFile
Типичное использование потоков ввода/вывода
Потоки ввода
1. Буферизированный ввод из файла
2. Ввод из памяти
3. Форматированный ввод из памяти
4. Вывод в файл
Выходные потоки
5. Сохранение и возврат
6. Чтение и запись файлов произвольного доступа
Ошибка?
Потоки в виде трубопровода
Стандартный ввод/вывод
Чтение из стандартного ввода
Замена System.out на PrintWriter
Перенаправление стандартного ввода/вывода
Компрессия
Простая компрессия с помощью GZIP
Многофайловое хранение с использованием Zip
Java архивы (JAR'ы)
Сериализация объектов
Нахождение класса
Управление сериализацией
Ключевое слово transient
Альтернатива Externalizable
Работа с версиями
Использование устойчивости
Токенизация(Tokenizing) ввода
StreamTokenizer
StringTokenizer
Проверка стиля капитализации
Резюме
Упражнения
12: Идентификация типа времени выполнения
Необходимость RTTI
Объект object
Литералы объектов
Проверка перед приведением
Использование литералов класса
Динамическое выражение instanceof
instanceof против эквивалентности Классов
Синтаксис RTTI
Рефлексия: информация о классе во время выполнения
Распаковщик методов класса
Резюме
Упражнения
13: Создание окон и Апплеты
Основы апплета
Ограничения апплета
Преимущества апплетов
Рабочее пространство приложения
Запуск апплетов в Web броузере
Использование Appletviewer
Тестирование апплетов
Запуск апплетов из командной строки
Отображение рабочего пространства
Использование Windows Explorer
Создание кнопок
Захват событий
Текстовые области
Управление компоновкой
BorderLayout
FlowLayout
GridLayout
GridBagLayout
Абсолютное позицианирование
BoxLayout
Лучший подход?
Модель событий Swing
События и типы слушателей
Использование слушающих адаптеров для упрощения
Отслеживание множественных событий
Каталог компонентов Swing
Кнопки
Группы кнопок
Иконки
Инструмент подсказки
Текстовые поля
Бордюры
Панели скролирования
Мини редактор
CheckBox-элементы
Радио кнопки
Комбинированные поля (выпадающие списки)
Списки
Закладки
Окна сообщений
Меню
Всплывающие меню
Рисунок
Окна диалогов
Файловые диалоги
HTML в Swing компонентах
Слайдеры и индикатор выполнения
Деревья
Таблицы
Выбор внешнего вида (Look & Feel)
Буфер обмена
Упаковка апплетов в JAR файл
Техника программирования
Динамическое построение событий
Отделение бизнес логики от логики пользовательского интерфейса
Каноническая форма
Визуальное программирование и компоненты (Beans)
Что такое компонент (Bean)?
Извлечение BeanInfo с помощью Инспектора
Более изощренные компоненты (Bean)
Помещение компонент в пакеты
Более сложная поддержка компонент (Bean)
Больше о компонентах (Beans)
Резюме
Упражнения
14: Множественные нити процессов
Отзывчивый пользовательский интерфейс
Наследование от процесса
Использование процессов для пользовательского интерфейса
Объединение процесса с основным классом
Создание множества процессов
Процессы демоны
Использование ограниченных ресурсов
Неправильный доступ к ресурсам
Как Java получает доступ к ресурсам
Синхронизация счетчиков
Эффективность синхронизации
Повторное обращение к JavaBeans
Блокировки
Установка блокировки
Засыпание
Приостановка и возобновление выполнения
Ожидание и уведомление
Блокировка во время операций ввода/вывода
Тестирование
Мертвая блокировка
Запрещение stop( ), suspend( ), resume( ), и destroy( ) в Java 2
Приоритеты
Чтение и установка приоритетов
Группы процессов
Управление группами процессов
Повторное изучение Runnable
Когда процессов слишком много
Резюме
Упражнения
15: Распределенные вычисления
Сетевое программирование
Идентификация машины
Сервера и клиенты
Тестирование программ без наличия сети
Порт: уникальное место внутри машины
Сокеты
Простой пример сервера и клиента
Обслуживание нескольких клиентов
Дейтаграммы
Использование ссылок URL внутри апплета
Чтение файла с сервера
Дальнейшее сетевое программирование
Java Database Connectivity (JDBC)
Получение примера для работы
Шаг 1: Поиск JDBC Драйвера
Шаг 2: Конфигурирование базы данных
Шаг 3: Проверка конфигурации
Шаг 4: Генерация вашего SQL запроса
Шаг 5: Изменеие и вставка в ваш запрос
GUI версия программы поиска
Почему JDBC API выглядит так сложно
Более изощренный пример
Сервлеты
Основы сервлетов
Сервлеты и множественные процессы
Управление сессиями с помощью сервлетов
Класс Cookie
Класс Session
Запуск примеров сервле
Java Server Pages
Неявные объекты
Директивы JSP
Элемены JSP скриптов
Извлечение полей и значений
Атрибуты JSP страницы и границы видимости
Управление сессиями в JSP
Создание и изменение cookies
Резюме о JSP
RMI (Удаленный вызов методов)
Удаленный интерфейс
Реализация удаленного интерфейса
Регистрация
Создание якорей и скелетов
Использование удаленных объектов
CORBA
Принципы CORBA
Язык Определения Интерфейсов CORBA(CORBA Interface Definition Language) - IDL
Служба Указания Имен
Пример
Написание исходного кода IDL
Создание якорей и скелетов
Реализация сервера и клиента
Некоторые службы CORBA
Активация процесса указания имен
Активация сервера и клиента
Java Апплеты и CORBA
CORBA против RMI
Enterprise JavaBeans
JavaBeans против EJB
Спецификация EJB
EJB компоненты
EJB контейнер и сервер
Java Naming и Directory Interface (JNDI)
Java Transaction API/Java Transaction Service (JTA/JTS)
CORBA и RMI/IIOP
Составные части EJB компонента
Enterprise Bean
Домашний интерфейс
Удаленный интерфейс
Описатель развертывания
EJB-Jar файл
EJB операции
Типы EJB
Session Beans
Entity Beans
Разработка EJB
Резюме о EJB
Jini: распределенные сервисы
В контексте Jini
Что такое Jini?
Как работает Jini
Процесс обнаружения
Процесс объединения
Процесс поиска
Разделение интерфейса и реализации
Абстрагирование распределенной системы
Резюме
Упражнения
A: Передача и возврат объектов.
Манипуляции с ссылками
Дублирующие ссылки (Aliasing)
Создание локальных копий объектов
Передача параметров "по значению"
Клонирование объектов
Добавление клонируемости в класс
Использование приема с protected
Реализация интерфейса Cloneable
Успешное клонирование
Функции метода Object.clone()
Клонирование составных объектов
Глубокое копирование при помощи ArrayList
Глубокое копирование при помощи сериализации (serialization)
Обеспечение клонируемости объектов-наследников
Почему используется такая странная конструкция?
Управление клонируемостью объектов
Конструкторы копирования
Почему это работает в C++ и не работает в Java?
Классы только для чтения
Создание классов только для чтения
Недостаток неизменных классов
Immutable строки
Неявные константы
Перегруженный ‘+’ и StringBuffer
Классы String и StringBuffer
Особенности строк
Итоги
Упражнения
B: The Java Native Interface (JNI)
Вызов собственных методов
javah: генератор заголовочных файлов на С
Искажение имен и сигнатура функций
Реализация вашей DLL
Доступ к JNI функциям: аргументы JNIEnv
Доступ к Java строкам
Передача и использование Java объектов
JNI и исключения в Java
JNI и нити процесса
Использование существующего кода
Дополнительная информация
C: Руководящие принципы программирования на Java
Проектировка
Реализация
D: Ресурсы
Программное обеспечение
Книги
Анализ и проектировка
Python
Мой собственный список книг
Index