- рекомендована Sun Microsystems как современное учебное пособие по основам языка Java и по работе в среде NetBeans
Исправлены опечатки и ошибки, имевшиеся в предыдущих изданиях. Исправлены старые примеры и добавлены новые, а также добавлены дистрибутивы NetBeans 6.9.1 и JDK 6u22.
- рекомендована Sun Microsystems как современное учебное пособие по основам языка Java и по работе в среде NetBeans 6.5.
Исправлены опечатки и ошибки, имевшиеся в первом издании. Добавлены и заметно расширены некоторые разделы, которые в первом издании были только обозначены - например, раздел, касающийся тестирования проектов в среде NetBeans и библиотеки JUnit 4. Всё изложение изменено в соответствии с довольно большими изменениями и усовершенствованиями, которые произошли в среде NetBeans при переходе от версии 6.0 к версии 6.5.
В крупнейших Интернет-магазинах
Books.ru,
Библион,
Ozon.ru,
и
Oz.by (Белоруссия, цена в белорусских рублях) книга попала в категорию бестселлеров в категории Java (и довольно часто она попадала в категорию бестселлеров в более широких категориях).
Спасибо покупателям и читателям за высокую оценку моей работы!
Книга «Язык программирования Java и среда NetBeans», первое издание - рекомендована Sun Microsystems как современное учебное пособие по основам языка Java и по работе в среде NetBeans 6.0.
Книга автора данного сайта В.В.Монахова вышла в издательстве БХВ-Петербург в марте 2008 г и быстро стала бестселлером в категории Java. Объём книги 627 с. (ошибочно указан 640 с.). К марту 2009 г. тираж книги в издательстве оказался полностью распродан.
Монахов В.В.
УДК 681.3.068
ББК 32.973.26-018.1
М77 Язык программирования Java и среда NetBeans.— 2-е изд., переработанное и дополненное
— СПб.: БХВ-Петербург, 2009. — 720 с.: ил. + CD-ROM
ISBN 978-5-9775-424-9
Книга написана на базе курса лекций, читаемых автором на кафедре вычислительной физики Санкт-Петербургского государственного университета. Второе издание ориентировано на использование среды NetBeans 6.5 и дополнено новыми материалами. Изложены основные синтаксические конструкции Java, принципы объектно-ориентированного программирования, особенности проведения численных расчетов. Приводятся сведения о разработке основных категорий программного обеспечения Java (ME, SE и EE). Рассказывается о создании сетевых приложений и приложений для мобильных устройств. Разбираются методики написания многопоточных приложений Java для систем с многоядерными процессорами. Материал сопровождается большим количеством примеров с подробным анализом их исходных кодов. На компакт-диске находятся дистрибутивы JDK 6u11 и NetBeans 6.5 для Windows и Linux, а также исходные тексты примеров.
Автор выражает благодарность рецензентам фирмы Sun Microsystems за замечания по тексту книги, Игорю Богдановичу Керницкому за помощь в разработки примеров по JNI, и С.В.Монаховой за помощь в работе.
Введение | 11 |
Глава 1. Общие представления о языке Java | 15 |
1.1. Java и другие языки программирования. Системное и прикладное программирование | 15 |
1.2. Виртуальная Java-машина, байт-код, JIT-компиляция. Категории программ, написанных на языке Java | 20 |
1.3. Алфавит языка Java. Десятичные и шестнадцатеричные цифры и целые числа. Зарезервированные слова | 26 |
Алфавит языка Java | 27 |
Десятичные и шестнадцатеричные цифры и целые числа | 27 |
Зарезервированные слова и литералы языка Java | 29 |
1.4. Управляющие последовательности. Символы Unicode. Специальные символы | 30 |
Управляющие последовательности | 30 |
Управляющие последовательности — символы формирования текста | 30 |
Управляющие последовательности — символы Unicode | 30 |
Простые специальные символы | 31 |
Составные специальные символы | 32 |
1.5. Идентификаторы. Переменные и типы. Примитивные и ссылочные типы | 33 |
1.6. Процедурное и объектно-ориентированное программирование. Инкапсуляция | 37 |
1.7. Работа со ссылочными переменными. Сборка мусора | 41 |
1.8. Проекты. Пакеты. Уровни видимости классов. Импорт классов | 46 |
1.9. Базовые пакеты и классы Java | 50 |
1.10. Технологии Java, .NET, ASP, PHP | 53 |
1.11. Среды разработки NetBeans, Eclipse, JDeveloper, JBuilder, IntelliJ IDEA | 58 |
NetBeans 6.5 | 59 |
Eclipse 3.4.1 (Ganimede) | 61 |
JDeveloper 11 | 63 |
JBuilder 2008 | 66 |
IntelliJ IDEA 7.0.4 | 68 |
Общий итог сравнения сред разработки | 68 |
Краткие итоги по главе | 69 |
Типичные ошибки | 72 |
Задания | 72 |
Глава 2. Среда NetBeans 6.5 | 73 |
2.1. Установка JDK 6 | 73 |
2.2. Установка среды NetBeans 6.5 | 77 |
2.3. Создание в NetBeans простейшего приложения Java | 85 |
2.4. Компиляция файлов проекта и запуск приложения. Jar-файлы | 91 |
2.5. Структура проекта NetBeans | 94 |
2.6. Создание в NetBeans приложения Java с графическим интерфейсом | 98 |
2.7. Редактор экранных форм | 103 |
2.8. Свойства компонентов | 109 |
2.9. Внешний вид приложения — технология Look and Feel | 115 |
2.10. Ведение проектов | 118 |
2.11. Редактирование меню экранной формы | 120 |
2.12. Создание нового класса | 129 |
2.13. Документирование исходного кода в Java | 130 |
2.14. Основные компоненты пакетов swing и awt | 139 |
2.15. Менеджеры размещения (Layout) и якоря (Anchor) | 144 |
2.16. Создание приложения Desktop Application | 145 |
Краткие итоги по главе | 147 |
Типичные ошибки | 148 |
Задания | 148 |
Глава 3. Примитивные типы данных и операторы для работы с ними |
151 |
3.1. Булевый (логический) тип | 151 |
3.2. Целые типы, переменные, константы | 152 |
3.3. Основные операторы для работы с целочисленными величинами | 156 |
3.4. Вещественные типы и класс Math | 157 |
3.5. Правила явного и автоматического преобразования типа при работе с числовыми величинами | 161 |
3.6. Оболочечные классы. Упаковка (boxing) и распаковка (unboxing) | 163 |
3.7. Приоритет операторов | 165 |
Краткие итоги по главе | 166 |
Типичные ошибки | 168 |
Задания | 168 |
Глава 4. Работа с числами в языке Java | 171 |
4.1. Двоичное представление целых чисел | 171 |
Позиционные и непозиционные системы счисления | 171 |
Двоичное представление положительных целых чисел | 173 |
Двоичное представление отрицательных целых чисел. Дополнительный код | 175 |
Сложение положительного и отрицательного чисел | 175 |
Сложение отрицательных чисел | 176 |
Проблемы целочисленной машинной арифметики. Целочисленное переполнение | 176 |
Сложение положительных чисел | 176 |
Умножение положительных чисел | 177 |
Шестнадцатеричное представление целых чисел и перевод из одной системы счисления в другую | 179 |
Преобразование чисел из системы с меньшим основанием в систему с большим основанием | 180 |
Преобразование чисел из системы с большим основанием в систему с меньшим основанием | 181 |
Преобразование чисел в системах счисления с кратными основаниями | 181 |
4.2. Побитовые маски и сдвиги | 182 |
4.3. Двоичное представление вещественных чисел | 185 |
Двоичные дроби | 185 |
Мантисса и порядок числа | 185 |
Научная нотация записи вещественных чисел | 187 |
Стандарт IEEE 754 представления чисел в формате с плавающей точкой | 188 |
Краткие итоги по главе | 193 |
Типичные ошибки | 194 |
Задания | 194 |
Глава 5. Управляющие конструкции | 197 |
5.1. Составной оператор | 197 |
5.2. Условный оператор if | 198 |
5.3. Оператор выбора switch | 202 |
5.4. Условное выражение ...?... : ... | 203 |
5.5. Операторы инкремента ++ и декремента -- | 204 |
5.6. Оператор цикла for | 204 |
5.7. Ошибки при использовании вещественного счетчика цикла | 206 |
5.8. Эффективная организация циклов при вычислениях в формате с плавающей точкой | 209 |
5.9. Особенности целочисленных вычислений — организация циклов, приоритет операторов и арифметическое переполнение | 214 |
5.10. Оператор цикла while — цикл с предусловием | 219 |
5.11. Оператор цикла do...while — цикл с постусловием | 221 |
5.12. Операторы прерывания continue, break, return, System.exit | 221 |
Краткие итоги по главе | 225 |
Типичные ошибки | 226 |
Задания | 226 |
Глава 6. Начальные сведения об объектном программировании | 227 |
6.1. Наследование и полиморфизм | 227 |
6.2. Функции. Модификаторы. Передача примитивных типов в функции | 236 |
6.3. Локальные и глобальные переменные. Модификаторы доступа и правила видимости. Ссылка this | 239 |
6.4. Передача ссылочных типов в функции. Проблема изменения ссылки внутри подпрограммы | 242 |
6.5. Наследование. Суперклассы и подклассы. Переопределение методов | 249 |
6.6. Наследование и правила видимости. Зарезервированное слово super | 255 |
6.7. Статическое и динамическое связывание методов. Полиморфизм | 257 |
6.8. Базовый класс Object | 259 |
6.9. Конструкторы. Зарезервированные слова super и this. Блоки инициализации | 261 |
6.10. Удаление неиспользуемых объектов и метод finalize. Проблема деструкторов для сложно устроенных объектов | 264 |
6.11. Перегрузка методов | 265 |
6.12. Правила совместимости ссылочных типов как основа использования полиморфного кода. Приведение и проверка типов | 268 |
Краткие итоги по главе | 271 |
Типичные ошибки | 273 |
Задания | 274 |
Глава 7. UML-диаграммы. Прямое и обратное проектирование. Рефакторинг | 275 |
7.1. UML-диаграммы | 275 |
7.2. Структура окон проектов с UML-диаграммами | 284 |
7.3. Панель инструментов проектов с UML-диаграммами | 287 |
7.4. Прямое проектирование (Forward engineering) — построение кода классов по UML-диаграммам | 291 |
7.5. Обратное проектирование (Reverse engineering) — построение UML-диаграмм по разработанным классам | 298 |
7.6. Рефакторинг | 304 |
Первый случай — переименование элементов программы | 306 |
Второй случай — перемещение класса | 308 |
Третий случай — копирование класса для его дальнейшей модификации | 308 |
Четвертый случай — безопасное удаление элемента программы | 309 |
Пятый случай — изменение списка параметров метода | 309 |
Шестой случай — инкапсуляция полей данных | 310 |
Краткие итоги по главе | 311 |
Типичные ошибки | 311 |
Задания | 312 |
Глава 8. Важнейшие объектные типы | 313 |
8.1. Массивы | 313 |
8.2. Коллекции, списки, итераторы | 319 |
8.3. Перебор в цикле элементов коллекций. Оператор цикла for-each | 323 |
8.4. Работа со строками в Java. Строки как объекты. Классы String, StringBuffer и StringBuilder | 324 |
8.5. Типы-перечисления (enum) | 338 |
8.6. Работа с датами и временем. Класс GregorianCalendar | 340 |
8.7. Работа с графикой и графическим пользовательским интерфейсом | 343 |
Код визуализации и код бизнес-логики приложения | 343 |
Графические примитивы | 344 |
Пример метода, работающего с графикой | 347 |
8.8. Исключительные ситуации | 350 |
Обработка исключительных ситуаций | 350 |
Иерархия исключительных ситуаций | 353 |
Объявление типа исключительной ситуации и оператор throw | 356 |
Объявление метода, который может возбуждать исключительную ситуацию. Зарезервированное слово throws | 358 |
8.9. Работа с файлами и папками | 361 |
Работа с файлами и папками с помощью объектов типа File | 361 |
Выбор файлов и папок с помощью файлового диалога | 365 |
Работа с потоками ввода/вывода | 369 |
Краткие итоги по главе | 377 |
Типичные ошибки | 379 |
Задания | 379 |
Глава 9. Интерфейсы и композиция | 381 |
9.1. Проблемы множественного наследования классов. Интерфейсы | 381 |
9.2. Отличия интерфейсов от классов. Проблемы наследования интерфейсов | 384 |
9.3. Пример работы с интерфейсами | 386 |
9.4. Композиция — еще одна альтернатива множественному наследованию | 389 |
Краткие итоги по главе | 391 |
Типичные ошибки | 391 |
Задания | 391 |
Глава 10. Многопоточное программирование и многоядерные системы | 393 |
10.1. Потоки выполнения (threads) и синхронизация | 393 |
10.2. Преимущества и проблемы при работе с потоками выполнения | 394 |
10.3. Синхронизация по ресурсам и событиям | 395 |
Синхронизация по ресурсам | 395 |
Синхронизация по событиям | 397 |
10.4. Класс Thread и интерфейсы Runnable и Callable. Создание и запуск потока выполнения | 398 |
10.5. Поля и методы, заданные в классе Thread | 400 |
10.6. Работа многопоточных приложений в многопроцессорных и многоядерных системах | 402 |
Причины перехода к многопроцессорным и многоядерным системам | 402 |
Пример многопоточной программы | 404 |
Работа многопоточного приложения на многоядерном компьютере | 412 |
10.7. Синхронизация на основе интерфейсов Lock и Condition | 414 |
Интерфейс Lock | 414 |
Интерфейс Condition | 418 |
Краткие итоги по главе | 420 |
Типичные ошибки | 421 |
Задания | 422 |
Глава 11. Введение в сетевое программирование | 423 |
11.1. Краткая справка по языку HTML | 423 |
Система WWW и язык HTML | 423 |
Теги и их атрибуты | 425 |
Математические и специальные символы, греческие буквы | 431 |
11.2. Апплеты | 433 |
Структура апплета | 433 |
Примеры апплетов. Аннотация @Override | 436 |
Создание проекта с апплетами | 440 |
Редактор HTML-документов, стилей CSS и кода JavaScript | 443 |
11.3. Сервлеты | 448 |
Создание сервлета и конфигурирование сервера приложений | 450 |
Локализация сервлетов — работа с языковыми форматами | 457 |
11.4. Технология JSP — Java Server Pages | 462 |
11.5. Технология JSTL — JSP Standard Tag Library | 467 |
Краткие итоги по главе | 469 |
Типичные ошибки | 470 |
Задания | 470 |
Глава 12. Вложенные классы | 471 |
12.1. Виды вложенных классов | 471 |
12.2. Статические (static) вложенные классы и интерфейсы | 472 |
12.3. Внутренние (inner) классы | 474 |
12.4. Локальные (local) классы | 477 |
12.5. Анонимные (anonimous) классы и обработчики событий | 477 |
12.6. Анонимные (anonimous) классы и слушатели событий (listeners) | 478 |
Краткие итоги по главе | 481 |
Типичные ошибки | 483 |
Задания | 483 |
Глава 13. Приложение с графическим интерфейсом — DesktopApplication | 485 |
13.1. Структура простой заготовки DesktopApplication | 485 |
13.2. Исходный код класса DesktopApplication | 487 |
13.3. Исходный код класса DesktopApplicationView | 489 |
13.4. Конструктор главной формы приложения. Ресурсы приложения и концепция управляющих синглетонов | 493 |
13.5. Аннотация @Action и показ справки | 498 |
13.6. Концепция управляющего объекта-модели. Модель TaskMonitor, класс Task и обработчик propertyChange | 500 |
13.7. Создание задачи типа Task. Назначение иконок и добавление изображений | 507 |
13.8. Локализация приложения | 512 |
13.9. Измерение времени и досрочное прекращение выполнения задания | 518 |
13.10. Работа с межпрограммным буфером обмена — Сlipboard | 519 |
Копирование строк и изображений из буфера обмена в программу | 519 |
Копирование строк из программы в буфер обмена. Класс StringSelection | 521 |
Копирование изображений из программы в буфер обмена. Создание класса ImageSelection | 523 |
13.11. Многопоточная система вычислений и индикации | 527 |
Краткие итоги по главе | 531 |
Типичные ошибки | 532 |
Задания | 532 |
Глава 14. Программирование мобильных телефонов | 533 |
14.1. Спецификация Java Micro Edition. Конфигурации и профили. Мидлеты | 533 |
14.2. Создание приложений для мобильных устройств | 534 |
14.3. Дизайнер пользовательского интерфейса мидлета | 540 |
14.4. Исходный код мидлета Hello, World! | 546 |
14.5. Заготовка мидлета "Крестики-нолики" | 555 |
14.6. Код бизнес-логики мидлета | 564 |
14.7. Создание собственного компонента, являющегося наследником TableItem, и мидлета на его основе. Создание библиотеки | 571 |
14.8. Запуск мидлета "Крестики-нолики" на реальном телефоне | 579 |
14.9. Пример мидлета с переключением экрана и списком выбора | 581 |
14.10. Примеры приложений для мобильных телефонов, поставляемые со средой NetBeans | 582 |
Краткие итоги по главе | 586 |
Типичные ошибки | 587 |
Задания | 587 |
Глава 15. Компонентное программирование | 589 |
15.1. Компонентная архитектура JavaBeans | 589 |
15.2. Создание компонента в NetBeans 6.5 | 590 |
15.3. Пример создания компонента в NetBeans 6.5 — панель с заголовком | 594 |
15.4. Добавление в компонент новых свойств | 598 |
15.5. Добавление в компонент новых событий | 600 |
Краткие итоги по главе | 603 |
Типичные ошибки | 605 |
Задания | 605 |
Глава 16. Платформо-зависимые методы и модуль C/C++ Pack | 607 |
16.1. Использование динамических библиотек. Объявление платформо-зависимых (native) методов | 607 |
16.2. Интерфейс JNI (Java Native Interface) взаимодействия Java с C/C++. Соответствие типов Java и C++ | 608 |
16.3. Пакет C/C++ Pack. Подключение компиляторов C++, C и библиотек | 614 |
16.4. Создание приложений C++ и C | 624 |
16.5. Примеры приложений с native-методами | 628 |
Первый этап. Создание исходного кода Java для native-методов | 628 |
Второй этап. Генерация h-файла заголовка C++, содержащего декларацию методов | 629 |
Третий этап. Написание на C++ реализации методов, заголовки которых заданы в сгенерированном файле jnipackage_JniMultiply.h | 630 |
Четвертый этап. Компиляция кода C++ в динамическую библиотеку (DLL) | 631 |
Пятый этап. Запуск приложения вместе с DLL в NetBeans | 632 |
Шестой этап. Распространение приложения вместе с DLL | 632 |
Краткие итоги по главе | 637 |
Типичные ошибки | 637 |
Задания | 638 |
Глава 17. Отладка, тестирование и профилирование программ | 639 |
17.1. Отладка приложений в среде NetBeans | 639 |
17.2. Команды режима пошагового выполнения | 643 |
17.3. Пример отладки неправильно работающего приложения | 650 |
17.4. Принцип "презумпции виновности" и тестирование классов | 654 |
17.5. Профилирование приложений | 668 |
17.6. Профилирование отдельных методов | 677 |
17.7. Настройка профилировщика "на лету". Точки профилирования | 684 |
17.8. Нахождение проблем с использованием памяти — телеметрия | 692 |
17.9. Профилирование использования памяти классами | 695 |
Краткие итоги по главе | 701 |
Типичные ошибки | 702 |
Задания | 702 |
Заключение | 703 |
Описание прилагаемого компакт-диска | 705 |
Литература | 711 |
Предметный указатель | 713 |