П.Ноутон, Г.Шилдт JAVA 2 Подробно излагаются основы нового платформно-независимого. объектноориентированного языка программирования Java 2, приведено описание библиотек его классов и методики разработки приложений, апплетов и сервлетов с помощью Java-подсистем Bean и Swing, а также способы миграции приложений из C/C++ . В книге рассматриваются интересные и сложные Java-приложения, в том числе многопользовательская сетевая игра в слова (word game). Изложение сопровождается огромным числом примеров и законченных программ, листинги которых Вы можете найти по адресу http://www.osborne.com. Содержание Об авторах Благодарности Предисловие ЧАСТЫ. ЯЗЫК JAVA Глава 1. Генезис Java Происхождение Java Рождение современного программирования: C Потребность в C++ Этап становления Java Создание Java Почему Java важен для Internet Java-апплеты и приложения Защита Мобильность Волшебство Java: байт-код Базовые термины Java Простой Объектно-ориентированный Устойчивый Многопоточный Архитектурно-независимый Интерпретируемость и высокая эффективность Распределенный Динамический Продолжение революции Свойства, добавленные версией 1.1 Свойства, исключенные из версии 1.1 Свойства, добавленные версией 2 Свойства, исключенные из версии 2 Java — не расширение HTML Глава 2. Обзор языка Java
1 3 5 9 11 11 12 13 15 15 17 18 18 19 19 21 21 22 22 23 23 23 24 24 24 25 25 26 27 27 29
Объектно-ориентированное программирование Две парадигмы программирования Абстракция Три принципа ООП Первая простая программа Ввод программы Компиляция программы Подробный взгляд на первую программу Вторая короткая программа Два оператора управления Оператор if Цикл for Использование блоков кода Лексические вопросы Пробельные символы Идентификаторы Константы Комментарии Разделители Ключевые слова языка Java Библиотеки классов языка Java Глава 3. Типы данных, переменные и массивы Java — язык со строгой типизацией Простые типы Целые типы Тип byte Тип short Тип int Тип long Типы с плавающей точкой Тип float Тип double Символьный тип (char) Булевский тип (boolean) Подробнее о литералах Целочисленные литералы Литералы с плавающей точкой Булевы литералы Символьные литералы Строковые литералы Переменные Объявление переменной Динамическая инициализация
29 29 30 31 37 37 38 39 41 43 43 45 46 48 48 48 49 49 49 50 51 52 52 53 53 54 55 55 56 56 57 57 58 59 60 60 61 62 62 63 63 63 64
Область действия и время жизни переменных Преобразование и приведение типов Автоматическое преобразование типов в Java Приведение несовместимых типов Автоматическое расширение типа в выражениях Правила расширения типов Массивы Одномерные массивы Многомерные массивы Альтернативный синтаксис объявления массива Несколько слов относительно строк Замечание для программистов C/C++ по поводу указателей Глава 4. Операции Арифметические операции Основные арифметические операции Деление по модулю Арифметические операции присваивания Инкремент и декремент Поразрядные операции Поразрядные логические операции Левый сдвиг Правый сдвиг Правый сдвиг без знака Поразрядная операция присваивания Операции отношений Операции булевой логики Короткие логические операции Операция присваивания Условная операция Старшинство операций Использование круглых скобок Глава 5. Управляющие операторы Операторы выбора Java Оператор if Оператор switch Операторы цикла Оператор цикла while Оператор цикла do while Оператор цикла for Вложенные циклы Операторы перехода Использование оператора break Использование оператора continue
65 68 68 69 70 71 72 72 75 80 80 81 82 82 83 84 85 86 88 90 92 94 96 97 98 100 102 102 103 104 105 106 106 106 110 115 115 117 120 125 125 126 130
Оператор return Глава 6. Введение в классы Основы классов Общая форма класса Простой класс Объявление объектов Операция new Назначение ссылочных переменных объекта Представление методов Добавление метода к классу Box Возврат значений Добавление метода с параметрами Конструкторы Параметризованные конструкторы Ключевое слово this Скрытие переменной экземпляра Сборка "мусора" Метод finalize() Класс Stack Глава 7. Методы и классы Перегрузка методов Перегрузка конструкторов Использование объектов в качестве параметров Передача аргументов Возврат объектов Рекурсия Управление доступом Статические элементы Спецификатор final Ревизия массивов Вложенные и внутренние классы Класс String Использование аргументов командной строки Глава 8. Наследование Основы наследования Доступ к элементам и наследование Практический пример Переменная суперкласса может ссылаться на объект подкласса Использование ключевого слова super Вызов конструктора суперкласса с помощью первой формы super Использование второй формы super Создание многоуровневой иерархии Когда вызываются конструкторы
132 133 133 134 135 138 139 140 141 142 144 146 148 150 152 152 153 153 154 158 158 162 164 167 169 170 172 177 179 179 181 185 188 189 189 191 192 195 196 196 200 201 204
Переопределение методов Динамическая диспетчеризация методов Зачем нужны переопределенные методы? Применение переопределения методов Использование абстрактных классов Использование ключевого слова final с наследованием Использование final для отказа от переопределения Использование final для отмены наследования Класс Object Глава 9. Пакеты и интерфейсы Пакеты Определение пакета Использование CLASSPATH Короткий пример пакета Зашита доступа Пример управления доступом Импорт пакетов Интерфейсы Определение интерфейса Реализация интерфейсов Применения интерфейсов Переменные в интерфейсах Расширение интерфейсов Глава 10. Обработка исключений Основные принципы обработки исключений Типы исключений Неотловленные исключения Использование операторов try и catch Отображение описания исключения Множественные операторы catch Вложенные операторы try Оператор throw Методы с ключевым словом throws Блок finally Встроенные исключения Java Создание собственных подклассов исключений Использование исключений Глава 11. Многопоточное программирование Поточная модель Java Приоритеты потоков Синхронизация Передача сообщений Класс Thread и интерфейс Runnable
205 208 210 211 212 216 216 217 217 219 220 220 221 222 223 224 228 230 231 232 235 239 241 243 243 244 245 246 248 249 251 253 255 256 258 260 262 263 264 265 266 266 267
Главный поток Создание потока Реализация интерфейса Runnable Расширение Thread Выбор подхода Создание множественных потоков Использование методов isAlive() и join() Приоритеты потоков Синхронизация Использование синхронизированных методов Оператор synchronized Межпоточные связи Блокировка Приостановка, возобновление и остановка потоков Приостановка, возобновление и остановка потоков в Java 1.1 и более ранних версиях Приостановка, возобновление и остановка потока в Java 2 Использование многопоточности Глава 12. Ввод/вывод, апплеты и другие темы Основы ввода/вывода Потоки Байтовые и символьные потоки Предопределенные потоки Чтение консольного ввода Чтение символов Чтение строк Запись консольного вывода Класс PrintWriter Чтение и запись файлов Апплеты. Основы программирования Модификаторы transient и volatile Использование instanceof Ключевое слово strictfp Native-методы Проблемы native-методов ЧАСТЬ II. БИБЛИОТЕКА JAVA Глава 13. Обработка строк String-конструкторы Длина строки Специальные строковые операции Строковые литералы Конкатенация строк Конкатенация других типов данных
268 270 270 272 ^74 274 276 ?78 281 282 284 786 791 794 794 297 299 301 301 302 302 305 306 307 308 309 310 312 315 319 319 322 323 327 329 331 332 334 334 335 335 336
Преобразование строк и метод toString() Извлечение символов Метод charAt() Метод getChars() Метод getBytes() Метод toCharArray() Сравнение строк Методы equals() и equalsIgnoreCase() Метод region Matches() Методы startsWith() и endsWith() Сравнение equals() и операции = = Метод compareTo() Поиск строк Изменение строки Метод substring() Метод concat() Метод replace() Метод trim() Преобразование данных, использующее метод valueOf() Изменение регистра символов в строке Класс StringBitffer Конструкторы StringBuffer Методы length() и capacity() Метод ensureCapacity() Метод setLength() Методы charAt() и setCharAt() Метод getChars() Метод append() Метод insert() Метод reverse() Методы delete() и deleteCharAt() Метод replace() Метод substring() Глава 14. Пакет java.lang Оболочки простых типов Класс Number Оболочки Double и Float Оболочки Byte, Short, Integer и Long Оболочка Character Оболочка Boolean Класс Void Класс Process Класс Runtime
337 338 338 339 339 340 340 340 341 341 343 343 344 346 346 347 348 348 349 350 350 351 351 352 352 353 353 354 355 355 356 357 357 358 359 359 360 365 374 378 378 379 379
Управление памятью Выполнение других программ Класс System Использование метода currentTimeMillis() Использование метода arraycopy() Свойства среды Класс Object Использование метода clone() и интерфейса Cloneable Класс Class Класс ClassLoader Класс Math Трансцендентные функции Экспоненциальные функции Округление функций Разные методы класса Math Компилятор Классы Thread, ThreadGroup и интерфейс Runnable Интерфейс Runnable Класс Thread Класс ThreadGroup Классы ThreadLocal и InheritableThreadLocal Класс Package Класс RunrimePermission Класс Trowable Класс SecurityManager Интерфейс Comparable Пакеты iava.lang.ref и java.lang.reflect Пакет java. lang.ref Пакет java.lang.reflect Глава 15. Пакет java.util: структура коллекций Краткий обзор коллекций Интерфейсы коллекций Интерфейс Collection Интерфейс List Интерфейс Set Интерфейс SortedSet Классы Collection Класс ArrayList Получение массива из ArrayList-объекта Класс LinkedList Класс HashSet Класс TreeSet Доступ к коллекции через итератор
381 382 384 386 387 387 388 389 391 394 395 395 396 397 398 399 399 399 399 402 407 408 409 409 410 410 410 410 411 412 413 415 416 419 421 421 422 423 425 427 428 430 431
Использование итератора Коллекции пользовательских классов Работа с картами отображений Интерфейсы карт Классы карт отображений Компараторы Использование компаратора Алгоритмы коллекций Массивы Наследованные классы и интерфейсы Интерфейс Enumeration Класс Vector Класс Stack Класс Dictionary Класс Hashtable Класс Properties Использование методов store() и load() Резюме Глава 16. Пакет java.util: сервисные классы Класс StringTokenizer Класс BitSet Класс Date Сравнение дат Класс Calendar Класс GregorianCalendar Класс TimeZone Класс SimpleTimeZone Класс Locale Класс Random Класс Observable Интерфейс Observable Пример наблюдателя Пакет java.util.zip Пакет java.util.jar Глава 17. Ввод/вывод: обзор пакета java.io Классы и интерфейсы ввода/вывода Java Класс File Каталоги Использование интерфейса FilenameFilter Альтернативный метод listFiles() Создание каталогов Поточные классы Байтовые потоки
433 434 436 436 440 444 445 448 452 456 457 457 463 465 466 470 474 476 477 477 479 482 484 484 488 490 491 492 493 496 497 498 500 500 501 501 503 506 507 508 509 509 509
Класс InputStream Класс OutputStream Класс FileInputStream Класс FileOutputStream Класс ByteArrayInputStream Класс ByteArrayOuputStream Фильтрованные байтовые потоки Буферизированные байтовые потоки Класс SequenceInputStream Класс PrintStream Класс RandomAccessFile Символьные потоки Класс Reader Класс Writer Класс FileReader Класс FileWriter Класс CharArrayReader Класс CharArrayWriter Класс BufferedReader Класс BufferedWriter Класс PushbackReader Класс PrintWriter Использование поточного ввода/вывода Улучшение метода wc с помощью класса StreamTokenizer Сериализация Интерфейс Serializable Интерфейс Externalizable Интерфейс Object Output Класс ObjeclOiirpulStream Интерфейс ObjectInput Класс ObjectInputStream Пример с сериализацией Преимущества потоков Глава 18. Работа в сети Основы работы в сети Обзор сокетов Клиент-сервер Зарезервированные сокеты Proxy-серверы Адресация Internet Java и сеть Сетевые классы и интерфейсы Класс InetAddress
510 510 511 513 515 516 517 518 522 523 524 525 525 526 527 528 529 530 531 533 533 534 535 537 519 540 540 540 541 54? 541 545 547 548 548 544 549 550 551 552 552 553 553
Производственные методы Методы экземпляра Сокеты TCP/IP клиентов Пример работы с сокет-соединением (программа Whois) Использование URL Формат Класс URLConnection Сокеты TCP/IP серверов: Кэширующий proxy HTTP-сервер Исходный код Дейтаграммы Класс DatagramPacket Дейтаграммный сервер и клиент Достоинства сети Глава 19. Класс Applet Основы апплетов Класс Applet Архитектура апплета Скелетная схема апплета Инициализация и завершение апплета Переопределение метода update() Простые методы отображения апплетов Требование перерисовки Апплет с бегущим заголовком Использование окна состояния Тег