
- •Кен Арнольд Джеймс Гослинг Дэвид Холмс Язык программирования 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
- •Приложение в Полезные таблицы
8.5. Преобразование строк
Довольно часто возникает необходимость преобразовать строку в значение другого типа (скажем, целого или логического) или наоборот. Согласно конвенции, принятой в Java, тип, к которому преобразуется значение, должен содержать метод, выполняющий преобразование. Например, преобразование из типа String в Integer должно выполняться статическим методом класса Integer. Ниже приводится таблица всех конвертируемых типов, а также способы их преобразования в тип String и обратно:
Тип |
В String |
Из String |
boolean |
String.valueOf(boolean) |
new Boolean(String).booleanValue() |
int |
String.valueOf(int) |
Integer.ParseInt(String, int base) |
long |
String.valueOf(long) |
Long.ParseLong(String, int base) |
float |
String.valueOf(float) |
new Float(String).floatValue() |
double |
String.valueOf(double) |
new Double(String).doubleValue() |
Для логических значений, а также для значений с плавающей точкой сначала создается объект Float или Double, после чего определяется его численное значение. Для значений с плавающей точкой не существует эквивалента метода parseInt, который напрямую выделяет значение из строки.
Не существует методов, которые переводили бы символы из форм, распознаваемых языком Java (\b, \udddd и т. д.) в переменные типа char или наоборот. Вы можете вызвать метод String.valueOf для отдельного символа, чтобы получить строку, состоящую из одного данного символа.
Также не существует возможности создать или преобразовать числовые строки в формат языка Java, в котором начальный 0 означает восьмеричную запись, а 0x— шестнадцатеричную.
Преобразования в byte и short, а также обратные им производятся через тип int, поскольку соответствующие значения всегда лежат в диапазоне int; к тому же при использовании этих типов в вычисляемых выражениях они все равно преобразуются в int.
Новые классы также могут поддерживать строковые преобразования; для этого в них следует включить метод toString и конструктор, который создает новый объект по строковому описанию. Классы, включающие метод toString, могут использоваться в valueOf. В соответствии с определением метода valueOf(Object obj), он возвращает либо строку “null”, либо obj.to String. Если все классы в вашей программе содержат метод toString, то вы сможете преобразовать любой объект в тип String вызовом valueOf.
8.6. Строки и символьные массивы
Содержимое строки может отображаться на символьный массив и наоборот. Часто в программе бывает необходимо предварительно построить строку в массиве char, после чего создать объект String по содержимому этого массива. Если описанный ниже класс StringBuffer (допускающий запись в строки) в каком-то конкретном случае не подходит, существует несколько методов и конструкторов класса String, помогающих преобразовать строку в массив char или же массив char— в строку.
Например, чтобы удалить из строки все вхождения определенного символа, можно воспользоваться следующим несложным алгоритмом:
public static String squeezeOut(String from, char toss) {
char[] chars = from.toCharArray();
int len = chars.length;
for (int i = 0; i << len; i++) {
if (chars[i] == toss) {
--len;
System.arraycopy(chars, i + 1,
chars, i, len - i);
--i; // рассмотреть повторно
}
}
return new String (chars, 0, len);
}
Метод squeezeOut сначала преобразует свою входную строку from в символьный массив при помощи метода toCharArray. Затем он в цикле перебирает элементы массива в поисках символа toss. Когда такой символ находится, длина возвращаемой строки уменьшается на 1, а все следующие символы массива сдвигаются к началу. Значение i уменьшается, чтобы можно было проверить новый символ в позиции i и выяснить, не следует ли удалить и его. Когда метод завершает просмотр массива, он возвращает новый объект String, содержащий “выжатую” строку. Для этого применяется конструктор String, которому в качестве аргументов передается исходный массив, начальная позиция внутри массива и количество символов.
Кроме того, имеется отдельный конструктор String, который получает в качестве параметра только символьный массив и использует его целиком. Оба этих конструктора создают копии массива, так что после создания String можно изменять содержимое массива— на содержимое строки это не повлияет.
При желании вместо конструкторов можно воспользоваться двумя статическими методами String.copyValueOf. Например, метод squeezeOut мог бы заканчиваться следующей строкой:
return String.copyValueOf(chars, 0, len);
Вторая форма copyValueOf получает один аргумент и копирует весь массив. Для полноты было решено сделать два статических метода copy ValueOf эквивалентными двум конструкторам String.
Метод toCharArray прост и достаточен в большинстве случаев. Когда желательно иметь больше возможностей для контроля за процессом копирования фрагментов строки в символьный массив, можно воспользоваться методом getChars:
public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
Копирует символы из строки в массив. Символы заданной подстроки копируются в массив начиная с dst[dstBegin]. Подстрока представляет собой фрагмент исходной строки, который начинается с позиции srcBegin и заканчивается на srcEnd (но не включает ее!). Любая попытка выхода за пределы строки или массива char приводит к возбуждению исключения IndexOutOfBoundsException.