Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по...

20
И. Н. Блинов В. С. Романчик Java Методы программирования Учебно-методическое пособие МИНСК ИЗДАТЕЛЬСТВО «ЧЕТЫРЕ ЧЕТВЕРТИ» 2013

Transcript of Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по...

Page 1: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

И. Н. БлиновВ. С. Романчик

JavaМетоды

программирования

Учебно-методическое пособие

МИНСКИЗДАТЕЛЬСТВО «ЧЕТЫРЕ ЧЕТВЕРТИ»

2013

Page 2: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

УДК 004.434ББК 32.973.26-018.2

Б69

Рецензенты:кандидат физико-математических наук С. В. Сахоненко,

кандидат физико-математических наук, доцент П. В. Гляков

Рекомендовано Учебно-методическим объединением по естественнонаучному образованию

в качестве пособия для студентов высших учебных заведений, обучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

направление специальности 1-31 03 01-05 «Математика (информационные технологии)»

Блинов, И.Н., Романчик, В. С.Java. Методы программирования : уч.-мет. пособие / И. Н. Блинов, В. С. Романчик. —

Минск : издательство «Четыре четверти», 2013. — 896 с. ISBN 978-985-7058-30-3.

Пособие предназначено для программистов, начинающих и продолжающих изучение технологий Java SE, JEE и других. В его первой части рассматриваются основы языка Java и концепции объектно-ориентированного программирования. Во второй части изложены аспекты применения библиотек классов языка Java, включая файлы, коллекции, сетевые и многопоточные приложения, а также взаи-модействие с ХМL. В третьей части приведены основы программирования распределенных информа-ционных систем с применением сервлетов, JSP и собственных тегов разработчика. В четвертой части даны основы практического применения шаблонов проектирования.

В конце каждой главы даются тестовые вопросы по материалу главы и задания для выполнения. В приложениях приведены дополнительные материалы, относящиеся к использованию UML, SQL, Ant, XML, а также краткое описание популярных технологий Log4J, JUnit, JPA и Hibernate.

  УДК 004.434  ББК 32.973.26-018.2

ISBN 978-985-7058-30-3 © Блинов И. Н., Романчик В. С., 2013 © Оформление. ОДО «Издательство

“Четыре четверти”», 2013

Б69

Page 3: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

3

ОГЛАВЛЕНИЕ

Часть 1. Основы Java

Глава 1. ВВЕДЕНИЕ В ООП И КЛАССЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12Глава 2. ТИПЫ ДАННЫХ И ОПЕРАТОРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31Глава 3. КЛАССЫ И ОБЪЕКТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54Глава 4. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97Глава 5. ВНУТРЕННИЕ КЛАССЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131Глава 6. ИНТЕРФЕЙСЫ И АННОТАЦИИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150

Часть 2. Использование классов и библиотекГлава 7. СТРОКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170Глава 8. ИСКЛЮЧЕНИЯ И ОШИБКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .201Глава 9. ПОТОКИ ВВОДА/ВЫВОДА . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225Глава 10. КОЛЛЕКЦИИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253Глава 11. ПОТОКИ ВЫПОЛНЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290Глава 12. JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342Глава 13. СЕТЕВЫЕ ПРОГРАММЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .376Глава 14. XML & JAVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .395

Часть 3. Технологии разработки web–приложенийГлава 15. СЕРВЛЕТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .456Глава 16. JAVA SERVER PAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .485Глава 17. CЕССИИ, СОБЫТИЯ И ФИЛЬТРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .522Глава 18. JSP STANDARD TAG LIBRARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .544Глава 19. ПОЛЬЗОВАТЕЛЬСКИЕ ТЕГИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .573

Часть 4. Шаблоны проектированияГлава 20. ШАБЛОНЫ И АНТИШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .592Глава 21. ПОРОЖДАЮЩИЕ ШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .605Глава 22. ШАБЛОНЫ ПОВЕДЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .629Глава 23. СТРУКТУРНЫЕ ШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .695Приложение 1. JUNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .751Приложение 2. LOG4J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .766Приложение 3. UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .780Приложение 4. БАЗЫ ДАННЫХ И ЯЗЫК SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .793Приложение 5. APACHE ANT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .813Приложение 6. JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .827Приложение 7. HIBERNATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .853Приложение 8. IDE ECLIPSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .868

Page 4: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

4

СОДЕРЖАНИЕ

ПРЕДИСЛОВИЕ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .10

Часть 1. Основы Java

Глава 1. ВВЕДЕНИЕ В ООП И КЛАССЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .12Основные понятия ООП. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12Язык Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14Простое приложение. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Основы классов и объектов Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20Объектные ссылки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24Консоль . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Base code conventions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Глава 2. ТИПЫ ДАННЫХ И ОПЕРАТОРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .31Базовые типы данных и литералы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31Документирование кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34Операторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Классы–оболочки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Операторы управления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Массивы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Глава 3. КЛАССЫ И ОБЪЕКТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .54Переменные класса, экземпляра и константы . . . . . . . . . . . . . . . . . . . . . . . . 55Ограничение доступа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Конструкторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57Методы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Статические методы и поля . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61Модификатор final. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63Абстрактные методы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64Модификатор native . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64Модификатор synchronized. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64Логические блоки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65Перегрузка методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Параметризованные классы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68Параметризованные методы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72Методы с переменным числом параметров . . . . . . . . . . . . . . . . . . . . . . . . . . 73Перечисления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76Immutable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80Декомпозиция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80Рекомендации при проектировании классов . . . . . . . . . . . . . . . . . . . . . . . . . 87

Page 5: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

СОДЕРЖАНИЕ

5

Глава 4. НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ . . . . . . . . . . . . . . . . . . . . . . . . . . . . .97Наследование. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Классы и методы final. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Использование super и this . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102Переопределение методов и полиморфизм . . . . . . . . . . . . . . . . . . . . . . . . . 103Методы подставки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106«Переопределение» статических методов . . . . . . . . . . . . . . . . . . . . . . . . . . 107Абстракция и абстрактные классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108Расширение функциональности системы. . . . . . . . . . . . . . . . . . . . . . . . . . . 110Класс Object. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112Клонирование объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115«Сборка мусора» и освобождение ресурсов . . . . . . . . . . . . . . . . . . . . . . . . 118Пакеты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120Статический импорт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Рекомендации при проектировании иерархии . . . . . . . . . . . . . . . . . . . . . . . 123

Глава 5. ВНУТРЕННИЕ КЛАССЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .131Внутренние (inner) классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Вложенные (nested) классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Анонимные (anonymous) классы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

Глава 6. ИНТЕРФЕЙСЫ И АННОТАЦИИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .150Интерфейсы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150Параметризация интерфейсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157Аннотации . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

Часть 2. Использование классов и библиотек

Глава 7. СТРОКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .170Класс String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Классы StringBuilder и StringBuffer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174Регулярные выражения. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177Интернационализация приложения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181Интернационализация чисел . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185Интернационализация дат . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187Форматирование строк . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189

Глава 8. ИСКЛЮЧЕНИЯ И ОШИБКИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .201Иерархия исключений и ошибок. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201Способы обработки исключений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204Обработка нескольких исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206Оператор throw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Блок finally. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211Собственные исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212Наследование и исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215Рекомендации по обработке исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Отладочный механизм assertion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Page 6: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ИСПОЛЬЗОВАНИЕ КЛАССОВ И БИБЛИОТЕК

6

Глава 9. ПОТОКИ ВВОДА/ВЫВОДА . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .225Байтовые и символьные потоки ввода/вывода. . . . . . . . . . . . . . . . . . . . . . . 225Класс File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230Предопределенные потоки. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233Сериализация объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Класс Scanner. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240Архивация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

Глава 10. КОЛЛЕКЦИИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .253Общие определения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253Списки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Метасимвол в коллекциях . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260Интерфейс ListIterator. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261Интерфейс Comparator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263Класс LinkedList и интерфейс Queue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267Интерфейс Deque и класс ArrayDeque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 270Множества . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271Карты отображений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275Унаследованные коллекции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278Алгоритмы класса Collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281

Глава 11. ПОТОКИ ВЫПОЛНЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .290Класс Thread и интерфейс Runnable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290Жизненный цикл потока. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291Управление приоритетами и группы потоков . . . . . . . . . . . . . . . . . . . . . . . 293Управление потоками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294Потоки–демоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296Потоки и исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297Атомарные типы и модификатор volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . 299Методы synchronized. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301Инструкция synchronized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303Монитор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306Методы wait(), notify() и notifyAll(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306Новые способы управления потоками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308Перечисление TimeUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309Блокирующие очереди . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310Семафоры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311Барьеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317«Щеколда» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320Обмен блокировками . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324Альтернатива synchronized. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327ExecutorService и Callable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329Phaser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332

Глава 12. JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342Драйверы, соединения и запросы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342СУБД MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345Простое соединение и простой запрос . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345

Page 7: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

СОДЕРЖАНИЕ

7

Метаданные . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Подготовленные запросы и хранимые процедуры . . . . . . . . . . . . . . . . . . . 350Транзакции. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354Точки сохранения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358Data Access Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358DAO. Уровень метода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360DAO. Уровень класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362DAO. Уровень логики. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365

Глава 13. СЕТЕВЫЕ ПРОГРАММЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .376Поддержка Интернета . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376Сокетные соединения по протоколу TCP/IP. . . . . . . . . . . . . . . . . . . . . . . . . 382Многопоточность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384Датаграммы и протокол UDP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387

Глава 14. XML & JAVA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .395Инструкции по обработке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398Указатели . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398Корректность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399Схема XSD. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402Простые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403Сложные типы. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403JAXB. Маршаллизация и демаршаллизация . . . . . . . . . . . . . . . . . . . . . . . . 412JAXB. Генерация классов. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417JAXP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424Валидирующие и невалидирующие анализаторы . . . . . . . . . . . . . . . . . . . . 424Древовидная и псевдособытийная модели. . . . . . . . . . . . . . . . . . . . . . . . . . 425Псевдособытийная модель. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426SAX–анализаторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 426Древовидная модель . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432DOM JAXP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433Создание XML–документа. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436StAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438XSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445Элементы таблицы стилей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447

Часть 3. Технологии разработки web–приложений

Глава 15. СЕРВЛЕТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .456Запуск контейнера сервлетов и размещение проекта . . . . . . . . . . . . . . . . . 462Простая JSP–страница. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 464Взаимодействие сервлета и JSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465Интерфейс ServletContext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468Интерфейс ServletConfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469Интерфейс HttpServletRequest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470

Page 8: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ИСПОЛЬЗОВАНИЕ КЛАССОВ И БИБЛИОТЕК

8

Интерфейс HttpServletResponse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473Атрибуты и параметры. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Многопоточность в сервлете . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474Многопоточность и электронная почта . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477

Глава 16. JAVA SERVER PAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .485Жизненный цикл. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487Неявные объекты в expression language . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489Стандартные элементы action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491JSP–документ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494Expression Language . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495Типы EL операторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Обработка ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502Взаимодействие JSP — сервлет — JSP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504Пул соединений. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515

Глава 17. CЕССИИ, СОБЫТИЯ И ФИЛЬТРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .522Сеанс (сессия) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 522Файлы Cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528Обработка событий. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 530Фильтры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535

Глава 18. JSP STANDARD TAG LIBRARY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .544JSTL core . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545Автоматическое приведение типов и перехват исключений . . . . . . . . . . . 548Исключающие условия <c:choose> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550Итераторы <c:forEach> и <c:forTokens> . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551Включение ресурсов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 554Динамические адреса и перенаправление . . . . . . . . . . . . . . . . . . . . . . . . . . 557JSTL formatting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 558JSTL sql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 563JSTL xml. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564JSTL functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569

Глава 19. ПОЛЬЗОВАТЕЛЬСКИЕ ТЕГИ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .573Первый тег . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573Тег с атрибутами . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 577Тег с телом . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579Обработка тела тега . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583Функции–теги. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584Элементы action для тегов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586

Часть 4. Шаблоны проектирования

Глава 20. ШАБЛОНЫ И АНТИШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .592Шаблоны GRASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Шаблон Expert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593Шаблон Creator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595Шаблон Low Coupling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596

Page 9: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

СОДЕРЖАНИЕ

Шаблон High Cohesion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599Шаблон Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601Антишаблоны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602

Глава 21. ПОРОЖДАЮЩИЕ ШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .605Шаблон Factory Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606Шаблон Abstract Factory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Шаблон Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615Шаблон Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 620Шаблон Prototype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623

Глава 22. ШАБЛОНЫ ПОВЕДЕНИЯ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .629Шаблон Chain of Responsibility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 630Шаблон Command. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638Шаблон Iterator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647Шаблон Mediator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 652Шаблон Memento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 657Шаблон Observer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661Шаблон State . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 668Шаблон Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 678Шаблон Template Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 682Шаблон Visitor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 684Шаблон Interpreter. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 689

Глава 23. СТРУКТУРНЫЕ ШАБЛОНЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .695Шаблон Bridge. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695Шаблон Decorator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703Шаблон Façade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709Шаблон Composite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713Шаблон Adapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719Шаблон Flyweight . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723Шаблон Proxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729

УКАЗАНИЯ И ОТВЕТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .735

Приложение 1. JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .751Приложение 2. Log4J . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .766Приложение 3. UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .780Приложение 4. БАЗЫ ДАННЫХ И ЯЗЫК SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .793Приложение 5. Apache Ant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .813Приложение 6. JPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .827Приложение 7. Hibernate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .853Приложение 8. IDE Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .868

СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .895

Page 10: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ПРЕДИСЛОВИЕ

Пособие «Java. Методы программирования» расширяет и включает перерабо-танную и обновленную версию предыдущих книг авторов «Java 2. Практическое руководство» 2005 года и «Java. Промышленное программирование» 2007 года.

Книга возникла в процессе обучения языку Java и технологиям студентов ме-ханико-математического факультета и факультета прикладной математики и ин-форматики Белорусского государственного университета, а также слушателей курсов повышения квалификации и преподавательских тренингов и семинарах EPAM Systems, Oracle и других образовательных программ по ряду направлений технологий Java. При изучении Java знание других языков необязательно, книгу можно использовать для обучения программированию на языке Java «с нуля».

Интересы авторов, направленные на обучение, определили структуру этой книги. Книга предназначена как для начинающих изучение Java-технологий, так и для студентов и программистов, переходящих на Java с другого языка программирования. Авторы считают, что «профессионала под ключ» обучить нельзя, им становятся только после участия в разработке нескольких серьез-ных Java-проектов. В то же время данный курс может служить ступенькой к мастерству. Прошедшие обучение по этому курсу успешно сдают различные экзамены, получают международные сертификаты и в состоянии участвовать в командной разработке промышленных программных проектов.

Книга разбита на четыре логические части. В первой части даны фундамен-тальные основы языка Java и концепции объектно-ориентированного програм-мирования. Во второй части изложены наиболее важные аспекты применения языка, в частности коллекции и базы данных, многопоточность и взаимодейст-вие с XML. В третьей части приведены основы программировании распреде-ленных информационных систем с применением сервлетов, JSP. В четвертой даны основы применения шаблонов проектирования.

В конце каждой главы даются тестовые вопросы по материалам данной гла-вы и задания для выполнения по рассмотренной теме. Ответы и пояснения к тестовым вопросам сгруппированы в отдельный блок.

В приложениях приведены дополнительные материалы, относящиеся к ис-пользованию в информационных системах, основанных на применении Java-технологий, популярных технологий Log4J и JUnit, Apache Ant для сборки при-ложений, а также основы языков UML и SQL.

Авторы выражают благодарность компании EPAM Systems и ее сотрудни-кам, принимавшим участие в подготовке материалов этой книги и в ее издании.

Page 11: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

Часть 1

Основы Java

В первой части книги излагаются вопросы, относящиеся к основам языка Java и практике

объектно-ориентированного программирования.

Page 12: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

12

Глава 1

ВВЕДЕНИЕ В ООП И КЛАССЫ

Каждый дурак может написать программу, которую может понять компьютер. Хороший программист пишет

программу, которую может понять человек.

Мартин Фаулер

Основные понятия ООП

Java является объектно-ориентированным языком программирования, вслед-ствие чего предварительно будут приведены основные парадигмы ООП.

В связи с проникновением компьютеров во все сферы социума программ-ные системы становятся более простыми для пользователя и сложными по вну-тренней архитектуре. Программирование стало делом команды, где маленьким проектом считается тот, который выполняет команда из 5–10 специалистов за время от полугода до года.

Основным способом борьбы со сложностью программных продуктов стало объектно-ориентированное программирование (ООП), являющееся в настоя-щее время наиболее популярной парадигмой.

ООП — методология программирования, основанная на представлении программного продукта в виде совокупности объектов, каждый из которых яв-ляется экземпляром конкретного класса. ООП использует в качестве базовых элементов взаимодействие объектов.

Объект — именнованная модель реальной сущности, обладающая конкрет-ными значениями свойств и проявляющая свое поведение.

В применении к объектно-ориентированным языкам программирования по-нятия объекта и класса конкретизируются.

Объект — обладающий именем набор данных (полей и свойств объекта), физически на ходящихся в памяти компьютера, и методов, имеющих доступ к ним. Имя исполь зуется для работы с полями и методами объекта.

Любой объект относится к определенному классу. В классе дается обобщен-ное описание некоторого набора родственных объектов.

Объект — конкретный экземпляр класса.В качестве примера можно привести абстракцию дома или его описание (класс)

и реальный дом (экземпляр класса или объект). Объект соответствует логической модели дома, представляющей совокупное описание всех физических объектов.

Page 13: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ВВЕДЕНИЕ В ООП И КЛАССЫ

13

Класс принято обозначать в виде прямоугольника, разделенного на три части.В верхний прямоугольник помещается имя класса, в средний — набор по-

лей с именами, типами, свойствами класса, и в нижний — список методов, их параметров и возвращаемых значений.

Реальный объект должен иметь конкретные значения всех полей, например:

id=35, masonry="brick", numberFloors=2, numberWindows=7.

Объектно-ориентированное программирование основано на принципах:— инкапсуляции;— наследования;— полиморфизма, в частности, «позднего связывания».Инкапсуляция (encapsulation) — принцип, объединяющий данные и код, ма-

нипулирующий этими данными, а также защищающий данные от прямого внешнего доступа и неправильного использования. Другими словами, доступ к данным класса возможен только посредством методов этого же класса.

Наследование (inheritance) — процесс, посредством которого один класс может наследовать свойства другого класса и добавлять к ним свойства и мето-ды, характерные только для него.

Наследование бывает двух видов:одиночное наследование — подкласс (производный класс) имеет один

и только один суперкласс (предок);множественное наследование — класс может иметь любое количество

предков (в Java запрещено).Полиморфизм (polymorphism) — механизм, использующий одно и то же

имя метода для решения похожих, но несколько отличающихся задач в раз-личных объектах при наследовании из одного суперкласса. Целью полимор-физма является использование одного имени при выполнении общих для су-перкласса и подклассов действий.

Механизм «позднего связывания» в процессе выполнения программы опре-деляет принадлежность объекта конкретному классу и производит вызов метода,

Рис. 2.1. Описание класса (абстракция) и реальный объектРис. 2.2. Графическое изображение класса

Page 14: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ОСНОВЫ JAVA

14

относящегося к классу, объект которого был использован. Механизм «позднего связывания» позволяет определять версию полиморфного (виртуального) мето-да во время выполнения программы. Другими словами, иногда невозможно на этапе компиляции определить, какая версия переопределенного метода бу-дет вызвана на этапе выполнения программы.

Краеугольным камнем наследования и полиморфизма предстает следующая парадигма: «объект подкласса может использоваться всюду, где использу-ется объект суперкласса». То есть при добавлении к иерархии классов нового подкласса существующий код с экземпляром нового подкласса будет работать точно так же, как и со всеми другими экземплярами классов в иерархии.

При вызове метода сначала он ищется в самом классе. Если метод сущест-вует, то он вызывается. Если же метод в текущем классе отсутствует, то обра-щение происходит к родительскому классу и вызываемый метод ищется в этом классе. Если поиск неудачен, то он продолжается вверх по иерархическому де-реву вплоть до корня (верхнего класса Object) иерархии.

Язык JavaОбъектно-ориентированный язык Java, разработанный в компании Sun

Microsystems в 1995 году для оживления графики на стороне клиента с помо-щью апплетов, в настоящее время используется для создания переносимых на различные платформы и опера ционные системы программ. Язык Java на-шел широкое применение в Интернет-приложениях, добавив на статические и клиентские веб-страницы динамическую графику, улучшив интерфейсы и реализовав вычислительные возможности. Но объектно-ориентированная парадигма и кроссплатформенность привели к тому, что уже буквально через несколько лет после создания язык практически покинул клиентские страницы и перебрался на серверы. На стороне клиента его место заняли языки JavaScript, Adobe Flash и проч.

При создании язык Java предполагался более простым, чем его синтаксиче-ский предок С++. Сегодня с появлением новых версий возможности языка Java существенно расширились и во многом перекрывают функциональность С++. Java уже не уступает по сложности предшественникам и называть его простым нельзя.

Отсутствие указателей (наиболее опасного средства языка С++) нельзя считать сужением возможностей, а тем более — недостатком, это просто тре-бование безопасности. Возможность работы с произвольными адресами памя-ти через безтиповые указатели позволяет игнорировать защиту памяти. Отсутствие в Java множественного наследования легко заменяется на более понятные конструкции с применением интерфейсов.

Системная библиотека классов языка Java содержит классы и пакеты, реа-лизующие и расширяющие базовые возможности языка, а также сетевые

Page 15: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ВВЕДЕНИЕ В ООП И КЛАССЫ

15

средства, взаимодействие с базами данных, графические интерфейсы и многое другое. Методы классов, включенных в эти библиотеки, вызываются JVM (Java Virtual Machine) во время интерпретации программы.

В Java все объекты программы расположены в динамической памяти — куче данных (heap) и доступны по объектным ссылкам, которые, в свою оче-редь, хранятся в стеке (stack). Это решение исключило непосредственный до-ступ к памяти, но усложнило работу с элементами массивов и сделало ее менее эффективной по сравнению с программами на C++. В свою очередь, в Java предложен усовершенствованный механизм работы с коллекциями, реализую-щими основные динамические структуры данных. Необходимо отметить, что объектная ссылка языка Java содержат информацию о классе объекта, на кото-рый она ссылается, так что объектная ссылка — это не указатель, а дескриптор (описание) объекта. Наличие дескрипторов позволяет JVM выполнять провер-ку совместимости типов на фазе интерпретации кода, генерируя исключение в случае ошибки. В Java изменена концепция организации динамического рас-пределения памяти: отсутствуют способы программного освобождения дина-мически выделенной памяти. Вместо этого реализована система автомати-ческого освобождения памяти (сборщик мусора), выделенной с помощью опе-ратора new. Программист может только рекомендовать системе освободить выделенную динамическую память.

В отличие от C++, Java не поддерживает множественное наследование, пе-регрузку операторов, беззнаковые целые, прямое индексирование памяти и, как следствие, указатели. В Java существуют конструкторы, но отсутствуют деструк-торы (применяется автоматическая сборка мусора), не используется оператор goto и слово const, хотя они являются зарезервированными словами языка.

Ключевые и зарезервированные слова языка Java:

abstract сontinue for new switchassert default goto* package synchronizedboolean do if private thisbreak double implements protected throwbyte else import public throwscase enum instanceof return transientcatch extends int short trychar final interface static voidclass finally long strictfp volatileconst* float native super while

Кроме ключевых слов в Java существуют три литерала: null, true, false, не от-носящиеся к ключевым и зарезервированным словам.

Page 16: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ОСНОВЫ JAVA

16

Простое приложение

Изучение любого языка программирования удобно начинать с программы передачи символьного сообщения на консоль.

// # 1 # простое линейное приложение # OracleSlogan.java

public class OracleSlogan { public static void main(String[ ] args) { // вывод строки System.out.println("Enabling the Information Age"); }}

Но уже в этом коде заложен фундамент будущих архитектурных ошибок. Пусть представленный выше класс является первым из множества классов си-стемы, которые будут созданы в процессе разработки небольшой системы пе-редачи некоторых сообщений, состоящей, например, из двух–трех десятков классов. СтрокаSystem.out.println("Enabling the Information Age");

может встречаться в коде этих классов многократно. Пусть в процессе тестиро-вания или внедрения системы окажется, что фразу необходимо заменить на другую, например, в конце поставить восклицательный знак. Для этого про-граммисту придется обыскивать весь код, искать места, где встречается ука-занная фраза, и заменять ее новой. Это по меньшей мере, неудобно. Что делать если таких классов — не пара десятков, а несколько сотен? Во избежание подобных проблем сообщение лучше хранить в отдельном методе или константе (а еще лучше — в файле) и при необходимости вызывать его. Тогда изменение текста сообщения приведет к локальному изменению одной-единственной строки кода. В следующем примере этот код будет переписан с использованием двух классов, реализованных на основе простейшего применения объектно-ориен-тированного программирования:

/* # 2 # простое объектно-ориентированное приложение # FirstProgram.java */

package by.bsu.simple;public class FirstProgram { public static void main(String [ ] args) { // объявление и создание объекта firstObject SloganAction firstObject = new SloganAction(); // вызов метода, содержащего вывод строки firstObject.printSlogan(); }}

Page 17: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ВВЕДЕНИЕ В ООП И КЛАССЫ

17

// # 3 # простой класс # SloganAction

class SloganAction { void printSlogan() { // определение метода // вывод строки System.out.println("Enabling the Information Age"); }}

Здесь класс FirstProgram используется для того, чтобы определить метод main(), который вызывается автоматически интерпретатором Java и может назы-ваться контроллером этого примитивного приложения. Метод main() получает в качестве параметра аргументы командной строки String[]args, представляю-щие массив строк, и является открытым (public) членом класса. Это означает, что метод main() может быть виден и доступен любому классу. Ключевое слово static объявляет методы и переменные класса, используемые при работе с клас-сом в целом, а не только с объектом класса. Символы верхнего и нижнего реги-стров здесь различаются. Тело метода main() содержит объявление объектаSloganAction firstObject = new SloganAction();

и вызов его методаfirstObject.printSlogan();

Вывод строки «Enabling the Information Age» в примере осуществляет метод println() (ln — переход к новой строке после вывода) статического поля out класса System, который подключается к приложению автоматически вместе с пакетом java.lang. Приведенную программу необходимо поместить в файл FirstProgram.java (расширение.java обязательно), имя которого должно сов-падать с именем public-класса.

Объявление классов предваряет строкаpackage by.bsu.simple;

указывающая на принадлежность классов пакету с именем by.bsu.simple, кото-рый является на самом деле каталогом на диске. Для приложения, состоящего из двух классов, наличие пакетов не является необходимостью. Однако даже при отсутствии слова package классы будут отнесены к пакету по умолчанию (unnamed), размещенному в корне проекта. Если же приложение состоит из не-скольких сотен классов, то размещение классов по пакетам является жизнен-ной необходимостью.

Классы из примеров 2 и 3 могут сохраняться как в одном файле, так и в двух файлах FirstProgram.java и SloganAction.java. На практике следует хранить классы в отдельных файлах, что позволяет всем разработчикам проекта быст-рее воспринимать концепцию приложения в целом.

Page 18: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ОСНОВЫ JAVA

18

/* # 4 # простое объектно-ориентированное приложение # FirstProgram.java */

package by.bsu.simple.run;import by.bsu.simple.action.SloganAction; // подключение класса из пакетаpublic class FirstProgram { public static void main(String[ ] args) { SloganAction firstObject = new SloganAction (); firstObject.printSlogan(); }}

// # 5 # простой класс # SloganAction.java

package by.bsu.simple.action;public class SloganAction { public void printSlogan() { // вывод строки System.out.println("Enabling the Information Age"); }}

Простейший способ компиляции — вызов строчного компилятора из корне-вого каталога, в котором находится каталог by, каталог bsu и так далее:javac by/bsu/simple/action/SloganAction.javajavac by/bsu/simple/run/FirstProgram.java

При успешной компиляции создаются файлы FirstProgram.class  и SloganAction.class, имена которых совпадают с именами классов. Запустить этот байткод можно с помощью интерпретатора Java:java by.bsu.simple.run.FirstProgram

Здесь к имени приложения FirstProgram.class добавляется путь к пакету от корня проекта by.bsu.simple.run, в котором он расположен.

Чтобы компилировать и выполнить приложение, необходимо загрузить и установить последнюю версию пакета, например по адресу:http://www.oracle.com/technetwork/java/javase/downloads/

При инсталляции рекомендуется указывать для размещения корневой ката-лог. Если JDK установлена в директории (для Windows) c:\Java\jdk7, то ката-лог, который компилятор Java будет рассматривать как корневой для иерархии пакетов, можно вручную задавать с помощью переменной среды окружения в виде: СLASSPATH=.;c:\Java\jdk7\.

Переменной задано еще одно значение «.» для использования текущей ди-ректории, например, с:\workspace в качестве рабочей для хранения своих соб-ственных приложений.

Чтобы можно было вызывать сам компилятор и другие исполняемые программы, переменную PATH нужно проинициализировать в виде PATH=c:\Java\jdk7\bin.

Page 19: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ВВЕДЕНИЕ В ООП И КЛАССЫ

19

Этот путь указывает на месторасположение файлов javac.exe и java.exe. В различных версиях операционных систем путь к JDK может указываться различными способами.

Однако при одновременном использовании нескольких различных версий компилятора и различных библиотек применение переменных среды окружения начинает мешать эффективной работе, так как при выполнении приложения по-иск класса осуществляется независимо от версии. Когда виртуальная машина обнаруживает класс с подходящим именем, она его и подгружает. Такая ситуа-ция предрасполагает к ошибкам, порой трудноопределимым. Поэтому перемен-ные окружения начинающим программистам лучше не определять вовсе.

Обработка аргументов командной строки, передаваемых в метод main(), отно-сится к необходимым в самом начале обучения языку программам. Аргументы представляют последовательность строк, разделенных пробелами, значения кото-рых присваиваются объектам массива String[]args. Элементу args[0] присваивает-ся значение первой строки после имен компилятора и приложения. Количество аргументов определяется значением args.length. Поле args.length является кон-стантным полем класса, представляющего массив, значение которого не может быть изменено на протяжении всего жизненного цикла объекта-массива.

/* # 6 # вывод аргументов командной строки в консоль # PrintArguments.java */

package by.bsu.arg;public class PrintArguments { public static void main(String[ ] args) { for (String str : args) { System.out.printf("Aргумент-> %s%n", str); } }}

В данном примере используется цикл for для неиндексируемого перебора всех элементов и метод форматированного вывода printf(). Тот же результат был бы получен при использовании традиционного вида цикла forfor (int i = 0; i < args.length; i++) { System.out.println("Aргумент-> " + args[i]);}

Запуск этого приложения осуществляется с помощью следующей команд-ной строки вида:java by.bsu.arg.PrintArguments 2012 Oracle "Java SE 7"

что приведет к выводу на консоль следующей информации:

Аргумент-> 2012Аргумент-> OracleАргумент-> Java SE 7

Page 20: Java4-4.by/sites/default/files/files/reviews/blinov_text.pdfобучающихся по специальности 1-31 03 01 «Математика (по направлениям)»,

ОСНОВЫ JAVA

20

Приложение, запускаемое с аргументами командной строки, может быть использовано как один из примитивных способов ввода в приложение внеш-них данных.

Основы классов и объектов Java

Классы в языке Java объединяют поля класса, методы, конструкторы, логические блоки и внутренние классы. Основные отличия от классов C++: все функции опре-деляются внутри классов и называются методами; невозможно создать метод, не являющийся методом класса, или объявить метод вне класса; спецификаторы до-ступа public, private, protected воздействуют только на те объявления полей, мето-дов и классов, перед которыми они стоят, а не на участок от одного до другого спецификатора, как в С++; элементы по умолчанию не устанавливаются в private, а доступны для классов из данного пакета. Объявление класса имеет вид:[спецификаторы] class ИмяКласса [extends СуперКласс] [implements список_интерфейсов] { /* определение класса */ }

Спецификатор доступа к классу может быть public (класс доступен в дан-ном пакете и вне пакета), final (класс не может иметь подклассов), abstract (класс может содержать абстрактные методы, объект такого класса создать нельзя). По умолчанию, если спецификатор класса не задан, он устанавливает-ся в дружественный (friendly). Такой класс доступен только в текущем пакете. Спецификатор friendly при объявлении вообще не используется и не является ключевым словом языка. Это слово используется в сленге программистов, что-бы как-то коротко обозначить значение по умолчанию.

Класс наследует все свойства и методы суперкласса, указанного после клю-чевого слова extends, и может включать множество интерфейсов, перечислен-ных через запятую после ключевого слова implements. Интерфейсы очень по-хожи на абстрактные классы, содержащие только константы и сигнатуры мето-дов без реализации.

Все классы любого приложения условно разделяются на две группы: классы — носители информации и классы, работающие с информацией. Классы, обладаю-щие информацией, содержат данные о предметной области приложения. Например, если приложение предназначено для управления воздушным движением, то пред-метной областью будут самолеты, пассажиры и пр. При проектировании классов информационных экспертов важна инкапсуляция, обеспечивающая значениям по-лей классов корректность информации. У рассмотренного выше класса House есть поле numberWindows, значение которого на может быть отрицательным. С помощью инкапсуляции ключевым словом private закрывается прямой доступ к значению поля через объект, а метод, отвечающий за инициализацию значения поля, будет выполнять проверку входящего значения на корректность.