- •Что такое Java?
- •История создания Java
- •Сложности внутри Sun Microsystems
- •Проект Green
- •Компания FirstPerson
- •Возрождение OaK
- •Java выходит в свет
- •История развития Java
- •Браузеры
- •Сетевые компьютеры
- •Платформа Java
- •Основные версии и продукты Java
- •Заключение
- •Методология процедурно-ориентированного программирования
- •Методология объектно-ориентированного программирования
- •Объекты
- •Состояние
- •Поведение
- •Уникальность
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Типы отношений между классами
- •Агрегация
- •Ассоциация
- •Наследование
- •Метаклассы
- •Достоинства ооп
- •Недостатки ооп
- •Заключение
- •Кодировка
- •Анализ программы
- •Пробелы
- •Комментарии
- •Лексемы
- •Виды лексем
- •Идентификаторы
- •Ключевые слова
- •Литералы
- •Целочисленные литералы
- •Дробные литералы
- •Логические литералы
- •Символьные литералы
- •Строковые литералы
- •Null-литерал
- •Разделители
- •Операторы
- •Пример программы
- •Дополнение. Работа с операторами
- •Операторы присваивания и сравнения
- •Арифметические операции
- •Логические операторы
- •Битовые операции
- •Заключение
- •Введение
- •Имена Простые и составные имена. Элементы
- •Имена и идентификаторы
- •Область видимости (введение)
- •Элементы пакета
- •Платформенная поддержка пакетов
- •Модуль компиляции
- •Объявление пакета
- •Импорт-выражения
- •Объявление верхнего уровня
- •Уникальность имен пакетов
- •Область видимости имен
- •"Затеняющее" объявление (Shadowing)
- •"Заслоняющее" объявление (Obscuring)
- •Соглашения по именованию
- •Заключение
- •Введение
- •Модификаторы доступа
- •Предназначение модификаторов доступа
- •Разграничение доступа в Java
- •Объявление классов
- •Заголовок класса
- •Тело класса
- •Объявление полей
- •Объявление методов
- •Объявление конструкторов
- •Инициализаторы
- •Дополнительные свойства классов
- •Метод main
- •Параметры методов
- •Перегруженные методы
- •Заключение
- •Введение
- •Виды приведений
- •Тождественное преобразование
- •Преобразование примитивных типов (расширение и сужение)
- •Преобразование ссылочных типов (расширение и сужение)
- •Преобразование к строке
- •Запрещенные преобразования
- •Применение приведений
- •Присвоение значений
- •Вызов метода
- •Унарное числовое расширение
- •Бинарное числовое расширение
- •Явное приведение
- •Оператор конкатенации строк
- •Числовое расширение
- •Тип переменной и тип ее значения
- •Заключение
- •Статические элементы
- •Ключевые слова this и super
- •Ключевое слово abstract
- •Интерфейсы
- •Объявление интерфейсов
- •Реализация интерфейса
- •Применение интерфейсов
- •Полиморфизм
- •Полиморфизм и объекты
- •Заключение
- •Массивы как тип данных в Java
- •Объявление массивов
- •Инициализация массивов
- •Многомерные массивы
- •Класс массива
- •Преобразование типов для массивов
- •Ошибка ArrayStoreException
- •Переменные типа массив и их значения
- •Клонирование
- •Клонирование массивов
- •Заключение
- •Управление ходом программы
- •Нормальное и прерванное выполнение операторов
- •Блоки и локальные переменные
- •Пустой оператор
- •Оператор if
- •Оператор switch
- •Управление циклами
- •Цикл while
- •Цикл do
- •Цикл for
- •Операторы break и continue
- •Оператор continue
- •Оператор break
- •Именованные блоки
- •Оператор return
- •Оператор synchronized
- •Ошибки при работе программы. Исключения (Exceptions)
- •Причины возникновения ошибок
- •Обработка исключительных ситуаций Конструкция try-catch
- •Конструкция try-catch-finally
- •Использование оператора throw
- •Проверяемые и непроверяемые исключения
- •Создание пользовательских классов исключений
- •Переопределение методов и исключения
- •Особые случаи
- •Заключение
- •Введение
- •Дерево компонентов
- •Положение
- •Видимость
- •Доступность
- •Алгоритм отрисовки
- •Методы класса Graphics для отрисовки
- •Состояние Graphics
- •Clip (ограничитель)
- •Методы repaint и update
- •Прорисовка контейнера
- •Наследники класса Component
- •Класс Canvas
- •Класс Label
- •Класс Button
- •Классы Checkbox и CheckboxGroup
- •Классы Choice и List
- •Классы TextComponent, TextField, TextArea
- •Класс Scrollbar
- •Наследники Container
- •Класс Panel
- •Класс ScrollPane
- •Класс Window
- •Классы Frame и Dialog
- •Класс FileDialog
- •Обработка пользовательских событий
- •Событие ActionEvent
- •События awt
- •Обработка событий с помощью внутренних классов
- •Пример приложения, использующего модель событий
- •Апплеты
- •Жизненный цикл апплета
- •Передача параметров
- •Интерфейс AppletContext
- •Менеджеры компоновки
- •Класс FlowLayout
- •Класс BorderLayout
- •Класс GridLayout
- •Класс CardLayout
- •Заключение
- •Введение
- •Многопоточная архитектура
- •Базовые классы для работы с потоками Класс Thread
- •Интерфейс Runnable
- •Работа с приоритетами
- •Демон-потоки
- •Синхронизация
- •Хранение переменных в памяти
- •Модификатор volatile
- •Блокировки
- •Методы wait(), notify(), notifyAll() класса Object
- •Заключение
- •Введение
- •Классы-обертки
- •Системные классы
- •SecurityManager – менеджер безопасности
- •Потоки исполнения
- •Исключения
- •Заключение
- •Работа с датами и временем Класс Date
- •Классы Calendar и GregorianCalendar
- •Метод set(int field,int value).
- •Метод add(int field,int delta).
- •Метод roll(int field,int delta).
- •Класс TimeZone
- •Класс SimpleTimeZone
- •Интерфейс Observer и класс Observable
- •Коллекции
- •Интерфейсы Интерфейс Collection
- •Интерфейс Set
- •Интерфейс List
- •Интерфейс Map
- •Интерфейс SortedSet
- •Интерфейс SortedMap
- •Интерфейс Iterator
- •Aбстрактные классы, используемые при работе с коллекциями
- •Конкретные классы коллекций
- •Класс Collections
- •Класс Properties
- •Интерфейс Comparator
- •Класс Arrays
- •Класс StringTokenizer
- •Класс BitSet
- •Класс Random
- •Локализация Класс Locale
- •Класс ResourceBundle
- •Классы ListResourceBundle и PropertiesResourceBundle
- •Заключение
- •Система ввода/вывода. Потоки данных (stream)
- •Классы InputStream и OutputStream
- •Классы-реализации потоков данных Классы ByteArrayInputStream и ByteArrayOutputStream
- •Классы FileInputStream и FileOutputStream
- •Классы FilterInputStream и FilterOutputStream и их наследники
- •Сериализация объектов (serialization)
- •Стандартная сериализация
- •Восстановление состояния
- •Граф сериализации
- •Расширение стандартной сериализации
- •Классы Reader и Writer и их наследники
- •Класс StreamTokenizer
- •Работа с файловой системой Класс File
- •Класс RandomAccessFile
- •Заключение
- •Основы модели osi
- •Класс a
- •Класс b
- •Класс c
- •Подсети. Маска подсети
- •Протоколы arp, rarp
- •Утилиты для работы с сетью
- •Пакет java.Net
- •Заключение
Преобразование к строке
Это преобразование уже не раз упоминалось. Любой тип может быть приведен к строке, т.е. к экземпляру класса String. Такое преобразование является исключительным в силу того, что охватывает абсолютно все типы, в том числе и boolean, про который говорилось, что он не может участвовать ни в каком другом приведении, кроме тождественного.
Напомним, как преобразуются различные типы.
Числовые типы записываются в текстовом виде без потери точности представления. Формально такое преобразование происходит в два этапа. Сначала на основе примитивного значения порождается экземпляр соответствующего класса-"обертки", а затем у него вызывается метод toString(). Но поскольку эти действия снаружи незаметны, многие JVM оптимизируют их и преобразуют примитивные значения в текст напрямую.
Булевская величина приводится к строке "true" или "false" в зависимости от значения.
Для объектных величин вызывается метод toString(). Если метод возвращает null, то результатом будет строка "null".
Для null -значения генерируется строка "null".
Запрещенные преобразования
Не все переходы между произвольными типами допустимы. Например, к запрещенным преобразованиям относятся: переходы от любого ссылочного типа к примитивному, от примитивного - к ссылочному (кроме преобразований к строке). Уже упоминавшийся пример - тип boolean - нельзя привести ни к какому другому типу, кроме boolean (как обычно - за исключением приведения к строке). Затем, невозможно привести друг к другу типы, находящиеся не на одной, а на соседних ветвях дерева наследования. В примере, который рассматривался для иллюстрации преобразований ссылочных типов, переход от Child к Child2 запрещен. В самом деле, ссылка типа Child может указывать на объекты, порожденные только от класса Child или его наследников. Это исключает вероятность того, что объект будет совместим с типом Child2.
Этим список запрещенных преобразований не исчерпывается. Он довольно велик, и в то же время все варианты достаточно очевидны, поэтому подробно рассматриваться не будут. Желающие могут получить полную информацию из спецификации.
Разумеется, попытка осуществить запрещенное преобразование вызовет ошибку компиляции.
Применение приведений
Теперь, когда рассмотрены все виды преобразований, перейдем к ситуациям в коде, где могут встретиться или потребоваться приведения.
Такие ситуации могут быть сгруппированы следующим образом.
Присвоение значений переменным (assignment). Не все переходы допустимы при таком преобразовании - ограничения выбраны таким образом, чтобы не могла возникнуть ошибочная ситуация.
Вызов метода. Это преобразование применяется к аргументам вызываемого метода или конструктора. Допускаются почти те же переходы, что и для присвоения значений. Такое приведение никогда не порождает ошибок. Так же приведение осуществляется при возвращении значения из метода.
Явное приведение. В этом случае явно указывается, к какому типу требуется привести исходное значение. Допускаются все виды преобразований, кроме приведений к строке и запрещенных. Может возникать ошибка времени исполнения программы.
Оператор конкатенации производит преобразование к строке своих аргументов.
Числовое расширение (numeric promotion). Числовые операции могут потребовать изменения типа аргумента(ов). Это преобразование имеет особое название - расширение (promotion), так как выбор целевого типа может зависеть не только от исходного значения, но и от второго аргумента операции.
Рассмотрим все случаи более подробно.
