Преобразование и приведение типов
Преобразование и приведение типов Те, кто уже обладает определенным опытом программирования, знают, что достаточно часто программисты присваивают переменной одного типа значение другого. Если оба эти типа совместимы, Java выполнит преобразование автоматически. Например, всегда можно присвоить значение типа int переменной типа long. Однако не все типы совместимы и, следовательно, не все преобразования типов безоговорочно разрешены. Например, не существует никакого определенного автоматического преобразования double в byte. К счастью, преобразования между несовместимыми типами выполнять все-таки можно. Для этого необходимо использовать приведение, которое выполняет явное преобразование несовместимых типов. Рассмотрим автоматическое преобразование и приведение типов. Автоматическое преобразование типов в Java При присваивании типа данных переменной другого типа автоматическое преобразования типа выполняется в случае удовлетворения следующих двух условий: · оба типы совместимы; · длина целевого типа больше длины исходного типа. При соблюдении этих двух условий выполняется преобразование с расширением. Например, тип int всегда достаточно велик, чтобы хранить все допустимые значения типа byte, поэтому никакие операторы явного приведения типа не требуются. С точки зрения преобразования с расширением числовые типы, среди которых целочисленный и с плавающей точкой, совместимы друг с другом. Однако не существует автоматических преобразований числовых типов в char или boolean. Типы char и boolean также не совместимы и между собой. Как уже говорилось ранее, Java выполняет автоматическое преобразование типов при сохранении целочисленной константы в переменных типа byte, short, long или char.
Приведение несовместимых типов Хотя автоматическое преобразование типов удобно, оно не в состоянии удовлетворить все потребности. Например, что делать, если нужно присвоить значение типа int переменной типа byte? Это преобразование не будет выполняться автоматически, поскольку тип byte меньше типа int. Иногда этот вид преобразования называют преобразованием с сужением, поскольку значение явно сужается, чтобы оно могло уместиться в целевом типе. Чтобы выполнить преобразование между двумя несовместимыми типами, необходимо использовать приведение типов. Приведение – это всего лишь явное преобразование типов. Общая форма преобразования имеет вид: (целевой_тип) значение Здесь целевой_тип определяет тип, к которому нужно преобразовать указанное значение. Например, следующий фрагмент кода приводит тип int к типу byte. Если значение целочисленного типа больше допустимого диапазона типа byte, оно будет уменьшено до результата деления по модулю (остатка от целочисленного деления) на диапазон типа byte. int a; byte b; //... b = (byte) a; При присваивании значения с плавающей точкой переменной целочисленного типа выполняется другой вид преобразования типа: усечение. Как вы знаете, целые числа не содержат дробной части. Таким образом, когда значение с плавающей точкой присваивается переменной целочисленного типа, дробная часть отбрасывается. Например, в случае присваивания значения 1, 23 целочисленной переменной результирующим значением будет просто 1. Дробная часть – 0, 23 – усекается. Конечно, если размер целочисленной части слишком велик, чтобы уместиться в целевом целочисленном типе, значение будет уменьшено до результата деления по модулю на диапазон целевого типа. Следующая программа демонстрирует ряд преобразований типа, которые требуют приведения:
// Демонстрация приведения типов. class Conversion { public static void main(String args[]) { byte b; int i = 257; double d = 323. 142; System. out. println(" \nПреобразование int в byte. " ); b = (byte) i; System. out. println(" i и b " + i + " " + b); System. out. println(" \nПреобразование double в int. " ); i = (int) d; System. out. println(" d и i " + d + " " + i); System. out. println(" \nПреобразование double в byte. " ); b = (byte) d; System. out. println(" d и b " + d + " " + b); } } Эта программа генерирует следующий вывод: Преобразование int в byte. i и b 257 1 Преобразование double в int. d и i 323. 142 323 Преобразование double в byte. d и b 323. 142 67 Рассмотрим каждое из этих преобразований. Когда значение 257 приводится к типу byte, результатом будет остаток от деления 257 на 256 (диапазон допустимых значений типа byte), который в данном случае равен 1. Когда значение переменной d преобразуется в тип int, его дробная часть отбрасывается. Когда значение переменной d преобразуется в тип byte, его дробная часть отбрасывается, и значение уменьшается до результата деления по модулю на 256, который в данном случае равен 67. Автоматическое повышение типа в выражениях Кроме операций присваивания определенное преобразование типов может выполняться также в выражениях. Для примера рассмотрим следующую ситуацию. Иногда в выражениях в целях обеспечения необходимой точности промежуточное значение может выходить за пределы допустимого диапазона любого из операндов. Например, рассмотрим следующее выражение: byte a = 40; byte b = 50; byte c = 100; int d = a * b / c; Результат вычисления промежуточного члена a*b вполне может выйти за пределы диапазона допустимых значений его операндов типа byte. Для решения подобных проблем при вычислении выражений Java автоматически повышает тип каждого операнда byte или short до int. То есть вычисление промежуточного выражения a*b выполняется с применением целочисленных значений, а не байтов. Поэтому результат промежуточного выражения 50 * 40, равный 2000, оказывается допустимым, несмотря на то, что и для a и для b задан тип byte. Хотя автоматическое повышение типа очень удобно, оно может приводить к досадным ошибкам во время компиляции. Например, следующий внешне абсолютно корректный код приводит к возникновению проблемы: byte b = 50; b = b * 2; // Ошибка! Значение типа int не может быть присвоено
// переменной типа byte! Код предпринимает попытку повторного сохранения произведения 50 * 2 – совершенно допустимого значения типа byte – в переменной типа byte. Однако, поскольку во время вычисления выражения тип операндов был автоматически повышен до int, тип результата также был повышен до int. Таким образом, теперь результат выражения имеет тип int, который не может быть присвоен переменной типа byte без приведения типа. Сказанное справедливо даже тогда, когда, как в данном конкретном случае, значение, которое должно быть присвоено, умещается в переменной целевого типа. В тех случаях, когда последствия переполнения понятны, следует использовать явное приведение типов вроде: byte b = 50; b = (byte)(b * 2); , которое приводит к правильному значению, равному 100.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|