- •Кен Арнольд Джеймс Гослинг Дэвид Холмс Язык программирования 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
- •Приложение в Полезные таблицы
5.15. Арифметические операторы
Java поддерживает семь арифметических операторов, которые работают с любыми числовыми типами:
+ сложение
- вычитание
* умножение
/ деление
% остаток
Java также поддерживает унарный минус (-) для изменения знака числа. Знак может быть изменен оператором следующего вида:
val = -val;
Кроме того, имеется и унарный плюс— например, +3. Унарный плюс включен для симметрии, без него было бы невозможно записывать константы вида +2.0.
5.15.1. Целочисленная арифметика
Целочисленная арифметика выполняется с дополнением по модулю 2— то есть при выходе за пределы своего диапазона допустимых значений (int или long) величина приводится по модулю, равному величине диапазона. Таким образом, в целочисленной арифметике никогда не происходит переполнения, встречаются лишь выходы значения за пределы диапазона.
При целочисленном делении происходит округление по направлению к нулю (то есть 7/2 равно 3, а –7/2 равно –3). Деление и остаток для целых типов подчиняются следующему правилу:
(x/y)*y + x%y == x
Следовательно, 7%2 равно 1, а –7%2 равно –1. Деление на ноль или нахождение остатка от деления на 0 в целочисленной арифметике не допускается и приводит к запуску исключения ArithmeticException.
Арифметические операции с символами представляют собой целочисленные операции после неявного приведения char к типу int.
5.15.2. Арифметика с плавающей точкой
Для работы с плавающей точкой (как для представления, так и для совершения операций) в Java используется стандарт IEEE7541985. В соответствии с ним допускаются как переполнение в сторону бесконечности (значение превышает максимально допустимое для double или float), так и вырождение в ноль (значение становится слишком малым и неотличимым от нуля для double или float). Также имеется специальное представление NaN (“Not A Number”, то есть “не-число”) для результатов недопустимых операций— например, деления на ноль.
Арифметические операции с конечными операндами работают в соответствии с общепринятыми нормами. Знаки выражений с плавающей точкой также подчиняются этим правилам; перемножение двух чисел с одинаковым знаком дает положительный результат, тогда как при перемножении двух чисел с разными знаками результат будет отрицательным.
Сложение двух бесконечностей с одинаковым знаком дает бесконечность с тем же знаком. Если знаки различаются— ответ равен NaN. Вычитание бесконечностей с одинаковым знаком дает NaN; вычитание бесконечностей с разными знаками дает бесконечность, знак которой совпадает со знаком левого операнда. Например, (-(-)) равно . Результат любой арифметической операции, в которой участвует величина NaN, также равен NaN. При переполнении получается бесконечность с соответствующим знаком, а при вырождении— ноль с соответствующим знаком. В стандарте IEEE имеется отрицательный ноль, который равен +0.0, однако 1f/0f равно положительной бесконечности, а 1f/-0f равно отрицательной бесконечности.
Если -0.0 == 0.0, как же отличить отрицательный ноль, полученный в результате вырождения, от положительного? Его следует использовать в выражении, в котором участвует знак, и проверить результат. Например, если значение x равно отрицательному нулю, то выражение 1/x будет равно отрицательной бесконечности, а если положительному— то положительной бесконечности.
Операции с бесконечностями выполняются по стандартным математическим правилам. Сложение (или вычитание) конечного числа с любой бесконечностью также дает бесконечность. Например, (-+x) дает - для любого конечного x.
Бесконечность может быть получена за счет соответствующей арифметической операции или использования имени бесконечности для объектов типа float или double: POSITIVE_INFINITY или NEGATIVE_INFINITY. Например, Double.NEGATIVE_INFINITY представляет значение отрицательной бесконечности для объектов типа double.
Умножение бесконечности на ноль дает в результате NaN. Умножение бесконечности на ненулевое конечное число дает бесконечность с соответствующим знаком.
Деление, а также деление с остатком может давать бесконечность или NaN, но никогда не приводит к исключениям. В таблице перечислены результаты арифметических операций при различных значениях операндов:
x |
y |
x/y |
x%y |
Конечное |
±0.0 |
NaN | |
Конечное |
±0.0 |
x | |
±0.0 |
±0.0 |
NaN |
NaN |
Конечное |
NaN | ||
NaN |
NaN |
Во всех остальных отношениях нахождение остатка при делении с плавающей точкой происходит аналогично нахождению целочисленного остатка. Вычисление остатка методом Math.IEEERemainder описано в разделе 14.8.