11-е изд. — Пер. с англ. и ред. И.В. Берштейна. — СПб.: Диалектика, 2019. — 864 с.: ил. — (Библиотека профессионала). — ISBN 978-5-907114-79-1.
Это одиннадцатое издание исчерпывающего руководства по написанию надежного, удобно сопровождаемого прикладного кода. Какой бы версией вы ни пользовались, будь то Java SE 9, 10 или 11, эта книга дает глубокое и практическое понимание языка Java и его интерфейса API, а сотни приведенных в ней реальных примеров демонстрируют эффективные и действенные способы решения практических задач прикладного программирования.
Обновленные в этой книге примеры кода отражают долгожданные возможности модуляризации, а также наглядно показывают, как писать легко расширяемый и сопровождаемый прикладной код на языке Java. Читая книгу, вы узнаете, как пользоваться новой утилитой JShell, реализующей цикл REPL для ускоренного освоения языка Java и экспериментальной разработки прикладных программ, практического применения усовершенствований в прикладном интерфейсе Process API, состязательной блокировке, протоколировании и компиляции.
В первом томе настоящего двухтомного издания главное внимание уделяется основным понятиям языка Java и средствам программирования пользовательского интерфейса, включая принципы ООП, обобщения, коллекции, лямбда-выражения, разработку графических программ средствами библиотеки Swing, а также методики параллельного и функционального программирования. Если у вас имеется достаточный опыт программирования на Java и вы собираетесь перейти к версии Java SE 9, 10 или 11, то лучшего руководства по компетентному подходу к решению практических задач программирования на Java вам не найти.
Предисловие
Введение в язык Java
Программная платформа Java
Характерные особенности Java
Простота
Объектно-ориентированный характер
Поддержка распределенных вычислений в сети
Надежность
Безопасность
Независимость от архитектуры компьютера
Переносимость
Интепретируемость
Производительность
Мноrопоточность
Динамичность
Аплеты и Интернет
Краткая история развития Java
Распространенные заблуждения относительно Java
Среда программирования на Java
Установка комплекта Java Development Kit
Загрузка комплекта JDK
Установка комплекта JDK
Установка библиотек и документации
Применение инструментов командной строки
Применение IDE
Утилита JShell
Основные языковые конструкции Java
Простая программа на Java
Комментарии
Типы данных
Целочисленные типы данных
Числовые типы данных с плавающей точкой
Тип данных char
Юникод и тип char
Тип данных boolean
Переменные и константы
Объявление переменных
Инициализация переменных
Константы
Перечислимые типы
Операции
Арифметические операции
Математические функции и константы
Преобразование числовых типов
Приведение типов
Сочетание арифметических операций с присваиванием
Операции инкремента и декремента
Операции отношения и логические операции
Поразрядные логические операции
Круглые скобки и иерархия операций
Символьные строки
Подстроки
Сцепление строк
Принцип постоянства символьных строк
Проверка символьных строк на равенство
Пустые и нулевые строки
Кодовые точки и единицы
Прикладной программный интерфейс API класса String
Оперативно доступная документация на API
Построение символьных строк
Ввод и вывод
Чтение вводимых данных
Форматирование выводимых данных
Файловый ввод и вывод
Управляющая логика
Область видимости блоков
Условные операторы
Неопределенные циклы
Определенные циклы
Оператор switch для многовариантного выбора
Операторы прерывания логики управления программой
Большие числа
Массивы
Объявление массивов
Доступ к элементам массива
Цикл в стиле for each
Копирование массивов
Параметры командной строки
Сортировка массивов
Многомерные массивы
Неровные массивы
Объекты и классы
Введение в ООП
Классы
Объекты
Идентификация классов
Отношения между классами
Применение предопределенных классов
Объекты и объектные переменные
Класс LocalDate из библиотеки Java
Модифицирующие методы и методы доступа
Определение собственных классов
Класс Employee
Использование нескольких исходных файлов
Анализ класса Employee
Первые действия с конструкторами
Объявление локальных переменных с помощью ключевого слова var
Обработка пустых ссылок на объекты
Явные и неявные параметры
Преимущества инкапсуляции
Привилегии доступа к данным в классе
Закрытые методы
Конечные поля экземпляра
Статические поля и методы
Статические поля
Статические константы
Статические методы
Фабричные методы
Метод main ()
Параметры методов
Конструирование объектов
Перегрузка
Инициализация полей по умолчанию
Конструктор без аргументов
Явная инициализация полей
Имена параметров
Вызов одного конструктора из другого
Блоки инициализации
Уничтожение объектов и метод finalize ()
Пакеты
Именование пакетов
Импорт классов
Статический импорт
Ввод классов в пакеты
Область видимости пакетов
Путь к классам
Указание пути к классам
Архивные JАR-файлы
Создание JАR-файлов
Файл манифеста
Исполняемые JАR-файлы
Многоверсионные архивные JАR-файлы
Примечание к параметрам командной строки
Документирующие комментарии
Вставка комментариев
Комментарии к классам
Комментарии к методам
Комментарии к полям
Комментарии общего характера
Комментарии к пакетам
Извлечение комментариев
Рекомендации по разработке классов
Наследование
Классы, супер.классы и подклассы
Определение подклассов
Переопределение методов
Конструкторы подклассов 1995.Иерархии наследования
Полиморфизм
Представление о вызовах методов
Предотвращение наследования: конечные классы и методы
Приведение типов
Абстрактные классы
Защищенный доступ
Глобальный суперкласс Object
Переменные типа Object
Метод equals ()
Проверка объектов на равенство и наследование
Метод hashCode ()
Метод toString ()
Обобщенные списочные массивы
Объявление списочных массивов
Доступ к элементам списочных массивов
Совместимость типизированных и базовых списочных массивов
Объектные оболочки и автоупаковка
Методы с переменным числом параметров
Классы перечислений
Рефлексия
Класс Class
Основы обработки исключений
Ресурсы
Анализ функциональных возможностей классов с помощью рефлексии
Анализ объектов во время выполнения с помощью рефлексии
Написание кода универсального массива с помощью рефлексии
Вызов произвольных методов и конструкторов
Рекомендации по применению наследования
Интерфейсы, лямбда-выражения и внутренние классы
Интерфейсы
Понятие интерфейса
Свойства интерфейсов
Интерфейсы и абстрактные классы
Статические и закрытые методы
Методы с реализацией по умолчанию
Разрешение конфликтов с методами по умолчанию
Интерфейсы и обратные вызовы
Интерфейс Comparator
Клонирование объектов
Лямбда-выражения
Причины для употребления лямбда-выражений
Синтаксис лямбда-выражений
Функциональные интерфейсы
Ссылки на методы
Ссылки на конструкторы
Область видимости переменных
Обработка лямбда-выражений
Еще о компараторах
Внутренние классы
Доступ к состоянию объекта с помощью внутреннего класса
Специальные синтаксические правила для внутренних классов
О пользе, необходимости и безопасности внутренних классов
Локальные внутренние классы
Дос1уп к конечным переменным из внешних методов
Анонимные внутренние классы
Статические внутренние классы
Загрузчики служб
Прокси-классы
О применении прокси-классов
Создание прокси-объектов
Свойства прокси-классов
Исключения, утверждения и протоколирование
Обработка ошибок
Классификация исключений
Объявление проверяемых исключений
Порядок генерирования исключений
Создание классов исключений
Перехват исключений
Перехват одного исключения
Перехват нескольких исключений
Повторное генерирование и связывание исключений в цепочку
Блок оператора finally
Оператор try с ресурсами
Анализ элементов трассировки стека
Рекомендации по обработке исключений
Применение утверждений
Понятие утверждения
Разрешение и запрет утверждений
Проверка параметров с помощью утверждений
Документирование предположений с помощью утверждений
Протоколирование
Элементарное протоколирование
Усовершенствованное протоколирование
Смена диспетчера протоколирования
Локализация
Обработчики протоколов
Фильтры
Средства форматирования
"Рецепт" протоколирования
Рекомендации по отладке программ
Обобщенное программирование
Назначение обобщенного программирования
Преимущества параметров типа
На кого рассчитано обобщенное программирование
Определение простого обобщенного класса
Обобщенные методы
Ограничения на переменные типа
Обобщенный код и виртуальная машина
Стирание типов
Преобразование обобщенных выражений
Преобразование обобщенных методов
Вызов унаследованного кода
Ограничения и пределы обобщений
Параметрам типа нельзя приписывать простые типы
Во время выполнения можно запрашивать только базовые типы
Массивы параметризованных типов недопустимы
Предупреждения о переменном числе ар~ументов
Нельзя создавать экземпляры переменных типа
Нельзя строить обобщенные массивы
Переменные типа в статическом контексте обобщенных классов недействительны
Нельзя генерировать или перехватывать экземпляры обобщенного класса в виде исключений
Преодоление ограничения на обработку проверяемых исключений
Остерегайтесь конфликтов после стирания типов
Правила наследования обобщенных типов
Подстановочные типы
Понятие подстановочного типа
Ограничения супертипа на подстановки
Неограниченные подстановки
Захват подстановок
Рефлексия и обобщения
Обобщенный класс Class
Сопоставление типов с помощью параметров Class<T
Сведения об обобщенных типах в виртуальной машине
Литералы типов
Коллекции
Каркас коллекций в Java
Разделение интерфейсов и реализаций коллекций
Интерфейс Collection
Итераторы
Обобщенные служебные методы
Интерфейсы в каркасе коллекций Java
Конкретные коллекции
Связные списки
Списочные массивы
Хеш-множества
Древовидные множества
Одно- и двухсторонние очереди
Очереди по приоритету
Отображения
Основные операции над отображениями
Обновление записей в отображении
Представления отображений
Слабые хеш-отображения
Связные хеш-множества и отображения
Перечислимые множества и отображения
Хеш-отображения идентичности
Представления и оболочки
Мелкие коллекции
Поддиапазоны
Немодифицируемые представления 483Содержание
Синхронизированные представления
Проверяемые представления
О необязательных операциях
Алгоритмы
Назначение обобщенных алгоритмов
Сортировка и перетасовка
Двоичный поиск
Простые алгоритмы
Групповые операции
Взаимное преобразование коллекций и массивов
Написание собственных алгоритмов
Унаследованные коллекции
Класс HashtaЫe
Перечисления
Таблицы свойств
Стеки
Битовые множества
Программирование графики
История развития инструментальных средств для разработки GUI на Java
Огображение фреймов
Создание фрейма
Свойства фрейма
Огображение данных в компоненте
Двухмерные формы
Окрашивание цветом
Применение шрифтов
Воспроизведение изображений
Обработка событий
Общее представление об обработке собьrrий
Пример обработки событий от щелчков на экранных кнопках
Краткое обозначение приемников событий
Классы адаптеров
Действия
События от мыши
Иерархия событий в библиотеке AWT
Прикладной интерфейс Preferences API
Компоненты пользовательского интерфейса в Swiпg
Библиотека Swing и проектный шаблон "модель-представление-контроллер
Введение в компоновку пользовательского интерфейса
Диспетчеры компоновки
Граничная компоновка
Сеточная компоновка
Ввод текста
Текстовые поля
Метки и пометка компонентов
Поля для ввода пароля
Текстовые области
Панели прокруrки
Компоненты для выбора разных вариантов
Флажки
Кнопки-переключатели
Границы
Комбинированные списки
Ре~улируемые ползунки
Меню
Создание меню
Пиктограммы в пунктах меню
Пункты меню с флажками и кнопками-переключателями
Всплывающие меню
Клавиши быстрого доступа и оперативные клавиши
Разрешение и запрет доступа к пунктам меню
Панели инструментов
Всплывающие подсказки
Расширенные средства компоновки
Диспетчер сеточно-контейнерной компоновки
Специальные диспетчеры компоновки
Диалоговые окна
Диалоговые окна для выбора разных вариантов
Создание диалоговых окон
Обмен данными
Диалоговые окна для выбора файлов
Параллелизм
Назначение потоков исполнения
Состояния потоков исполнения
Новые потоки исполнения
Исполняемые потоки
Блокированные и ожидающие потоки исполнения
Завершенные потоки исполнения
Свойства потоков исполнения
Прерывание потоков исполнения
Потоковые демоны
Именование потоков исполнения
Обработчики необрабатываемых исключений
Приоритеты потоков исполнения
Синхронизация
Пример СОСТОЯНИЯ ГОНОК
Объяснение причин, приводящих к состоянию гонок
Объекты блокировки
Объекты условий
Ключевое слово synchronized
Синхронизированные блоки
Принцип монитора
Поля и переменные типа volatile
Поля и переменные типа final
Атомарность операций
Взаимные блокировки
Локальные переменные в потоках исполнения
Причины, по которым методы stop () и suspend () не рекомендованы к применению
Потокобезопасные коллекции
Блокирующие очереди
Эффективные отображения, множества и очереди
Атомарное обновление записей в отображениях
Групповые операции над параллельными хеш-отображениями
Параллельные представления множеств
Массивы, копируемые при записи
Алгоритмы обработки параллельных массивов
Устаревшие потокобезопасные коллекции
Задачи и пулы потоков исполнения
Интерфейсы CallaЫe и Future
Исполнители
Управление группами задач
Архитектура вилочного соединения
Асинхронные вычисления
Завершаемые будущие действия
Составление завершаемых будущих действий
Длительные задачи в обратных вызовах пользовательского интерфейса
Процессы
Построение процесса
Выполнение процесса
Дескрипторы процессов
Библиотека JavaFX
Отображение данных на сцене
Первое JаvаFХ-приложение
Рисование геометрических форм
Текст и изображения
Обработка событий
Реализация обработчиков событий
Реагирование на изменения свойств
События от мыши и клавиатуры
Компоновка
Панели КОМПОНОВКИ
Язык FXМL
Стилевые таблицы CSS
Элементы управления пользовательского интерфейса
Элементы управления вводом текста
Элементы управления выбором разных вариантов
Меню
Простые диалоговые окна
Специальные элементы управления
Свойства и привязки
Свойства в библиотеке JavaFX
Привязки
Длительные задачи в обратных вызовах пользовательского интерфейса
Приложение. Ключевые слова Java
Предметный указатель