- •Кен Арнольд Джеймс Гослинг Дэвид Холмс Язык программирования 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
- •Приложение в Полезные таблицы
10.3. Содержимое пакета
Если в исходном файле отсутствует объявление package, то входящие в него типы считаются принадлежащими к “безымянному” пакету.
К проектированию пакета следует подходить внимательно и включать в него только функционально связанные классы и интерфейсы. Классы пакета могут свободно обращаться к незакрытым членам друг друга. Защита членов класса предназначена для предотвращения некорректных действий со стороны классов, обладающих доступом к деталям внутренней реализации других классов. В пределах пакета не существует никаких ограничений доступа, кроме priv a te, и в итоге может получиться так, что посторонний класс получил к другим классам более близкий доступ, чем вам хотелось бы.
Кроме того, пакет должен составляться исходя из логического разделения задач, чтобы помочь программистам, которые ищут полезные для себя интерфейсы и классы. Если пакет состоит из несвязанных классов, будет сложно понять, что же из этого можно применить в работе. Логическое разделение способствует повторному использованию вашего кода, поскольку программистам будет легче ориентироваться в нем.
Если пакет состоит из взаимосвязанных типов, вы сможете давать им очевидные имена, избегая при этом конфликтов с посторонними типами из этого же пакета.
Пакет может быть составной частью другого пакета. Например, пакет java.lang является вложенным, то есть пакет lang входит в более обширный пакет java. Пакет java не содержит ничего, кроме других пакетов. Вложение позволяет построить иерархическую систему имен для взаимосвязанных пакетов.
Например, чтобы создать набор пакетов для адаптивных систем (скажем, нейросетей или генетических алгоритмов), можно воспользоваться вложенными пакетами, разделяя их имена точками:
package adaptive.neuralNet;
Исходный файл с таким объявлением входит в пакет adaptive.neuralNet, который, в свою очередь, является подпакетом пакета adaptive. Пакет adaptive может содержать классы, относящиеся к общим адаптивным алгоритмам,— например, методы с общей постановкой генетических проблем илиспособы измерения каких-то показателей. Каждый пакет, который находится ниже в иерархии (например, adaptive.neuralNet или adaptive. genetic), содержит классы, предназначенные для конкретного типа адаптивных алгоритмов.
Вложение пакетов является средством организации взаимосвязанных пакетов и не имеет отношения к правам доступа. Классы пакета adaptive. genetic не смогут работать с закрытыми на пакетном уровне идентификаторами из adaptive или adaptive.neuralNet. Область видимости пакета не выходит за его пределы. Вложение позволяет группировать взаимосвязанные пакеты и помогает программистам искать классы в иерархической структуре, но не дает никаких других преимуществ.
Глава 11 пакет ввода/вывода
С точки зрения программиста, пользователь — это периферийное устройство, вводящее символы в ответ на команду read. Питер Уильямс
Ввод/вывод в Java описывается в терминах потоков. Потоком /К сожалению, в отечественной литературе одним словом "поток" переводятся совершенно разнородные термины thread (см. выше) и stream, что создает определенную двусмысленность. В тех случаях, когда контекст не дает однозначного толкования, для перевода thread используется уточняющий термин "программный поток" - Примеч. перев./ называется упорядоченная последовательность данных, которая имеет источник (входной поток) или приемник (выходной поток). Потоки ввода/вывода избавляют программиста от необходимости вникать в конкретные детали операционной системы и позволяют осуществлять доступ к файлам. В основе работы всех потоков лежит ограниченный набор базовых интерфейсов и абстрактных классов; большинство типов потоков (например, потоки для работы с файлами) поддерживают базовые методы, иногда— с минимальными модификациями. Самый лучший способ освоения ввода/вывода в Java заключается в изучении базовых интерфейсов и абстрактных классов. В качестве примера мы рассмотрим файловые потоки.
Основным исключением из этой модели являются потоки данных, которые читают и записывают значения базовых типов Java, таких как int или string. Эти потоки поддерживают более широкий набор методов, спроектированный с учетом их специфики. Они рассматриваются во второй части этой главы, начиная с раздела 11.16.
Пакет ввода/вывода в Java называется java.io. Он импортируется во всех листингах этой главы, даже если строка import и не входит в пример.
На момент написания книги не существовало стандартной библиотеки для манипуляций с выходными числовыми или строковыми форматами— скажем, задания минимальной или максимальной ширины или желательной точности для числа с плавающей точкой.