
- •Кен Арнольд Джеймс Гослинг Дэвид Холмс Язык программирования Java
- •Глава 1 первое знакомство с java 6
- •Глава 2 классы и объекты 29
- •Глава 3 расширение классов 47
- •Глава 4 интерфейсы 70
- •Глава 5 лексемы, операторы и выражения 78
- •Глава 6 порядок выполнения 105
- •Глава 7 исключения 113
- •Глава 8 строки 121
- •Глава 9 потоки 134
- •Глава 10 пакеты 156
- •Глава 11 пакет ввода/вывода 158
- •Глава 12 стандартные вспомогательные средства 183
- •Глава 13 применение типов в программировании 205
- •Глава 14 системное программирование 218
- •Глава1 первое знакомство сjava
- •1.1. С самого начала
- •1.2.Переменные
- •1.3. Комментарии
- •1.4.Именованные константы
- •1.4.1. Символы Unicode
- •1.5.Порядок выполнения
- •1.6.Классы и объекты
- •1.6.1.Создание объектов
- •1.6.2.Статические поля
- •1.6.3.Сборщик мусора
- •1.7.Методы и параметры
- •1.7.1.Вызов метода
- •1.7.2.Ссылка this
- •1.7.3.Статические методы
- •1.8.Массивы
- •1.9.Строковые объекты
- •1.10.Расширение класса
- •1.10.1.Класс Object
- •1.10.2.Вызов методов суперкласса
- •1.11. Интерфейсы
- •1.12.Исключения
- •1.13.Пакеты
- •1.14.Инфраструктура Java
- •1.15.Прочее
- •Глава 2 классы и объекты
- •2.1. Простой класс
- •2.2. Поля
- •2.3. Управление доступом и наследование
- •2.4. Создание объектов
- •2.5. Конструкторы
- •2.6. Методы
- •2.6.1. Значения параметров
- •2.6.2. Применение методов для ограничения доступа
- •2.7. Ссылка this
- •2.8. Перегрузка методов
- •2.9. Статические члены
- •2.9.1. Блоки статической инициализации
- •2.9.2. Статические методы
- •2.10. Сборка мусора и метод finalize
- •2.10.1. Метод finalize
- •2.10.2. Восстановление объектов в методе
- •2.11. Метод main
- •2.12. Метод toString
- •2.13. Родные методы
- •Глава 3 расширение классов
- •3.1. Расширенный класс
- •3.2. Истинное значение protected
- •3.3. Конструкторы в расширенных классах
- •3.3.1. Порядок вызова конструкторов
- •3.4. Переопределение методов и скрытие полей
- •3.4.1. Ключевое слово super
- •3.5. Объявление методов и классов с ключевым словом final
- •3.6. Класс Object
- •3.7. Абстрактные классы и методы
- •3.8. Дублирование объектов
- •3.9. Расширение классов: когда и как
- •3.10. Проектирование расширяемого класса
- •Глава 4 интерфейсы
- •4.1. Пример интерфейса
- •4.2. Одиночное и множественное наследование
- •4.3. Расширение интерфейсов
- •4.3.1. Конфликты имен
- •4.4. Реализация интерфейсов
- •4.5. Использование реализации интерфейса
- •4.6. Для чего применяются интерфейсы
- •Глава 5 лексемы, операторы и выражения
- •5.1. Набор символов
- •5.2. Комментарии
- •5.3. Лексемы
- •5.4. Идентификаторы
- •5.4.1. Зарезервированные слова Java
- •5.5. Примитивные типы
- •5.6. Литералы
- •5.6.1. Ссылки на объекты
- •5.6.2. Логические значения
- •5.6.3. Целые значения
- •5.6.4. Значения с плавающей точкой
- •5.6.5. Символы
- •5.6.6. Строки
- •5.7. Объявления переменных
- •5.7.1. Значение имени
- •5.8. Массивы
- •5.8.1. Многомерные массивы
- •5.9. Инициализация
- •5.9.1. Инициализация массивов
- •5.10. Приоритет и ассоциативность операторов
- •5.11. Порядок вычислений
- •5.12. Тип выражения
- •5.13. Приведение типов
- •5.13.1. Неявное приведение типов
- •5.13.2. Явное приведение и instanceof
- •5.13.3. Строковое приведение
- •5.14. Доступ к членам
- •5.15. Арифметические операторы
- •5.15.1. Целочисленная арифметика
- •5.15.2. Арифметика с плавающей точкой
- •5.15.3. Арифметика с плавающей точкой и стандарт ieee-754
- •5.15.4. Конкатенация строк
- •5.16. Операторы приращения и уменьшения
- •5.17. Операторы отношения и условный оператор
- •5.18. Поразрядные операции
- •5.19. Условный оператор
- •5.20. Операторы присваивания
- •5.21. Имена пакетов
- •Глава 6 порядок выполнения
- •6.1. Операторы и блоки
- •6.2. Оператор if-else
- •6.3. Оператор switch
- •6.4. Цикл while и do-while
- •6.5. Оператор for
- •6.6. Метки
- •6.7. Оператор break
- •6.8. Оператор continue
- •6.9. Оператор return
- •Глава 7 исключения
- •7.1. Создание новых типов исключений
- •7.2. Оператор throw
- •7.3. Условие throws
- •7.4. Операторы try, catch и finally
- •7.4.1. Условие finally
- •7.5. Когда применяются исключения
- •Глава 8 строки
- •8.1. Основные операции со строками
- •8.2. Сравнение строк
- •8.3. Вспомогательные методы
- •8.4. Создание производных строк
- •8.5. Преобразование строк
- •8.6. Строки и символьные массивы
- •8.7. Строки и массивы byte
- •8.8. Класс StringBuffer
- •8.8.1. Модификация буфера
- •8.8.2. Извлечение данных
- •8.8.3. Работа с емкостью буфера
- •Глава 9 потоки
- •9.1. Создание потоков
- •9.2. Синхронизация
- •9.2.1. Методы synchronized
- •9.2.2. Операторы synchronized
- •9.3. Методы wait и notify
- •9.4. Подробности, касающиеся wait и notify
- •9.5. Планирование потоков
- •9.6. Взаимная блокировка
- •9.7. Приостановка потоков
- •9.8. Прерывание потока
- •9.9. Завершение работы потока
- •9.10. Завершение приложения
- •9.11. Использование Runnable
- •9.12. Ключевое слово volatile
- •9.13. Безопасность потоков и ThreadGroup
- •9.14. Отладка потоков
- •Глава 10 пакеты
- •10.1. Имена пакетов
- •10.2. Пакетный доступ
- •10.3. Содержимое пакета
- •Глава 11 пакет ввода/вывода
- •11.1. Потоки
- •11.2. Класс InputStream
- •11.3. Класс OutputStream
- •11.4. Стандартные типы потоков
- •11.5. Фильтрующие потоки
- •11.6. Класс PrintStream
- •11.7. Буферизованные потоки
- •11.8. Байтовые потоки
- •11.9. Класс StringBufferInputStream
- •11.10. Файловые потоки и FileDescriptor
- •11.11. Конвейерные потоки
- •11.12. Класс Seq uenceInputStream
- •11.13. Класс LineNumberInputStream
- •11.14. Класс PushbackInputStream
- •11.15. Класс StreamTokenizer
- •11.16. Потоки данных
- •11.16.1. Классы потоков данных
- •11.17. Класс RandomAccessFile
- •11.18. Класс File
- •11.19. Интерфейс FilenameFilter
- •11.20. Классы ioException
- •Глава 12 стандартные вспомогательные средства
- •12.1. Класс BitSet
- •12.2. Интерфейс Enumeration
- •12.3. Реализация интерфейса Enumeration
- •12.4. Класс Vector
- •12.5. Класс Stack
- •12.6. Класс Dictionary
- •12.7. Класс Hashtable
- •12.8. Класс Properties
- •12.9. Классы Observer/Observable
- •12.10. Класс Date
- •12.11. Класс Random
- •12.12. Класс String Tokenizer
- •Глава 13 применение типов в программировании
- •13.1. Класс Class
- •13.2. Загрузка классов
- •13.3. Классы-оболочки: общий обзор
- •13.4. Класс Boolean
- •13.5. Класс Character
- •13.6. Класс Number
- •13.7. Класс Integer
- •13.8. Класс Long
- •13.9. Классы Float и Double
- •Глава 14 системное программирование
- •14.1. Стандартный поток ввода/вывода
- •14.2. Управление памятью
- •14.3. Системные свойства
- •14.4. Создание процессов
- •14.5. Класс Runtime
- •14.6. Разное
- •14.7. Безопасность
- •14.8. Класс Math
- •Приложение а Родные методы
- •А.1 Обзор
- •А.2.1 Имена
- •А.2.2 Методы
- •А.2.3 Типы
- •А.2.5 Средства безопасности
- •А.2.6 Работа с памятью
- •А.3 Пример
- •А.3.1 Внутреннее строение LockableFile
- •А.4 Строки
- •А.5 Массивы
- •А.6 Создание объектов
- •А.7 Вызов методов Java
- •А.8 Последнее предупреждение
- •Приложение б Runtime-исключения в Java
- •Б.1 Классы RuntimeException
- •Б.2 Классы Error
- •Приложение в Полезные таблицы
13.3. Классы-оболочки: общий обзор
Для большинства примитивных типов в языке Java существуют классы, представляющие значения данного типа. Эти классы-оболочки обладают двумя основными функциями. Первая— в них находятся методы и переменные, относящиеся к типу (например, методы строковых преобразований и константы для границ диапазона). Следующий пример показывает, как можно проверить, допустимо ли для данной величины выполнение быстрых вычислений типа float или же ее диапазон выходит за границы, разрешенные для float:
if (value >= Float.MIN_VALUE && value <= Float.MAX_VALUE)
return fasterFloatCalc((float)value);
else
return slowerDoubleCalc(value);
Вторая функция заключается в возможности создания объектов, содержащих значения определенного примитивного типа, для универсальных классов, умеющих работать только со ссылками на Object. Например, объекты Hash table могут содержать только ссылки на Object, а не на примитивные типы. Чтобы использовать int в качестве ключа или элемента в объекте Hashtable, необходимо создать объект Integer, содержащий нужное значение:
Integer keyObj = new Integer(key);
map.put(keyObj, value);
В оставшейся части этой главы рассматриваются методы и константы, входящие в классы-оболочки Java. Некоторые из них являются общими для всех классов, поэтому они будут упомянуты до того, как мы перейдем к конкретным классам.
Следующие конструкторы и методы присутствуют во всех классах-оболочках:
Конструктор, который получает значение примитивного типа и создает объект класса (например, конструктор Character(char)).
Конструктор, который определяет исходное значение объекта по единственному параметру типа St ring.
Метод toString, который возвращает строковое представление объекта.
Метод typeValue, который возвращает значение примитивного типа — например, Character.charValue или Boolean.booleanValue.
Метод equals, который определяет, равны ли между собой объекты, относящиеся к одному классу.
Метод hashCode, который возвращает хеш-код, используемый в хеш-таблицах.
Эти методы имеются в каждом из классов-оболочек, поэтому они не приводятся в приведенных ниже описаниях для конкретных классов. Методы выборки и декодирования системных свойств рассматриваются в разделе “Системные свойства” и также отсутствуют в описаниях классов.
Термин “основание”, иногда используемый в классах-оболочках, соответствует термину “основание системы счисления”. Например, декодирование значения long по основанию 8 означает то же самое, что и перевод в восьмеричную систему счисления.
13.4. Класс Boolean
Класс Boolean служит для представления логического типа boolean. Метод valueOf и конструктор со строковым параметром считают, что строка “true” при любом сочетании символов верхнего и нижнего регистра соответствует true; любая другая строка интерпретируется как false.
13.5. Класс Character
Класс Character служит для представления символьного типа char. Помимо констант MIN_VALUE и MAX_VALUE, он содержит две константы MIN_RADIX и MAX_RADIX, которые равны минимальному и максимальному основанию системы счисления, которые используются методами (описанными ниже) для перевода отдельного цифрового символа в его целочисленный эквивалент и наоборот. Основание должно находиться в диапазоне 2–36; цифры свыше 9 представлены буквами от A до Z или их эквивалентами в нижнем регистре.
public static int digit(char ch, int radix)
Возвращает численный эквивалент цифры ch в системе счисления с основанием radix. Если символ не является допустимой цифрой, то возвращается –1.
public static char forDigit(int digit, int radix)
Возвращает символьное значение заданной цифры в заданной системе счисления. Если цифра является недопустимой в этой системе, возвращается символ \u0000.
Класс Character также содержит методы для работы с различными атрибутами символов, включая регистр.В Unicode имеется три разновидности регистра: верхний, нижний и заглавный (title case). Верхний и нижний регистры, наверное, хорошо знакомы большинству читателей. Заглавный регистр используется для обозначения символов, которые состоят из нескольких компонентов и написание которых изменяется в заголовках, где первые буквы слов обычно делают прописными. Например, в слове “ljepotica” /Слово "ljepotica" на хорватском языке означает "красавица"./ первая буква является символом lj нижнего регистра (\u01c9, символ из набора Extended Latin, используемого при записи хорватских диграфов). Если это слово встретится в названии книги и вы захотите преобразовать первые буквы всех слов в верхний регистр, то необходимо вызвать для них метод toTitleCase, что в нашем случае даст строку “Ljepotica” (в которой используется символ Lj с кодом \u01c8). Если же по ошибке вызвать метод toUpperCase, будет получена неправильная строка “LJepotica” (символ LJ с кодом \u01c7).
Все проблемы в работе с регистрами решаются в соответствии со стандартом Unicode. Например, в грузинском языке буквы верхнего регистра считаются архаичными, и преобразование в верхний регистр обычно нежелательно. Поэтому метод toUpperCase не переводит грузинские буквы нижнего регистра в верхний, хотя метод toLowerCase переведет буквы из верхнего регистра в нижний. Поэтому нельзя быть уверенным в том, что символы, отличающиеся только регистром, станут одинаковыми после вызова toUpperCase или toLowerCase. Тем не менее выражение
Character.toUpperCase(Character.toLowerCase(ch));
дает символ, который можно сравнить с другим символом, полученным аналогичным образом. Если полученные символы совпадают, то исходные символы также были одинаковыми и могли отличаться только регистром.
public static boolean isDefined(char ch)
Возвращает true, если символ ch определен в стандарте Unicode.
public static boolean isLowerCase(char ch)
Возвращает true, если символ ch является буквой нижнего регистра.
public static boolean isUpperCase(char ch)
Возвращает true, если символ ch является буквой верхнего регистра.
public static boolean isTitleCase(char ch)
Возвращает true, если символ ch является буквой заглавного регистра.
public static boolean isDigit(char ch)
Возвращает true, если символ ch является цифрой (см. табл. 4 на стр. ).
public static boolean isLetter(char ch)
Возвращает true, если символ ch является буквой (см.примечание).
public static boolean isLetterOrDigit(char ch)
Возвращает true, если символ ch является буквой или цифрой.
public static boolean isJavaLetter(char ch)
Возвращает true, если с символа ch может начинаться идентификатор в Java— конкретно, если он является буквой или одним из символов ‘_’ или ‘$’.
public static boolean isSpace(char ch)
Возвращает true, если ch является стандартным символом-разделителем— ‘ ‘, ‘\t’, ‘\n’, ‘\f’ или ‘\r’.
public static char toLowerCase(char ch)
Переводит символ ch в нижний регистр.Если эквивалент символа в нижнем регистре отсутствует, возвращается ch.
public static char toUpperCase(char ch)
Переводит символ ch в верхний регистр.Если эквивалент символа в верхнем регистре отсутствует, возвращается ch.
public static char toTitleCase(char ch)
Переводит символ ch в заглавный регистр.Если эквивалент символа в заглавном регистре отсутствует, возвращается ch.
public static int digit(char ch, int radix)
Возвращает численное значение символа ch, рассматриваемого в качестве цифры с заданным основанием. При недопустимом основании возвращается –1. Буквы AZ и az используются для цифр, которые представляют значения 10 и более.
public static char forDigit(int digit, int radix)
Возвращает символ, представляющий цифру digit с заданным основанием radix. Если digit превышает radix или значение radix выходит за пределы разрешенного диапазона, возвращается –1.