Найти в Дзене
тотСамыйАйтишник

#8 Java: Явные и неявные приведения примитивных типов.

Java: План и дорожная карта развития + СОДЕРЖАНИЕ.

статья №7 Java: Константы.

Приветствую Тебя, мой дорогой друг. Пришло время покончить с примитивными типами данных, надеюсь больше к ним не вернемся. Важная тема, определенно ты не раз с ней столкнешься.

Итак, Что значит привидение типа? А значит - это, преобразование одного типа в другой, к примеру из целочисленного в вещественный.

В Java имеется два вида преобразований явное и неявное и два типа преобразования расширяющее и сужающее. Начнем с неявного. Неявное - это автоматическое преобразование, которое Java делает сама. Что для этого нужно:

  • Обязательно, совместимость обоих типов.
  • Размерность преобразуемого типа должна быть равна или быть меньше результирующего типа.
Неявное преобразование.
Неявное преобразование.

На картинке показаны типы данных которые без проблем автоматически преобразуются в другие типы, ну кроме некоторых, которые имеют возможность потери точности.

Вероятность потерь - это возможная потеря точности или даже данных, чаще при преобразовании вещественного в целочисленный тип теряется дробная часть, а хуже когда потеря происходит именно данных, к примеру попытка преобразовать значение типа "double" выходящее за рамки диапазона типа "long".
Java автоматически преобразовывает из типа в тип, неявное преобразование.
Java автоматически преобразовывает из типа в тип, неявное преобразование.

Расширяющее преобразование типа - это преобразование меньшего типа в больший, как в примерах на картинке выше, то есть переменная с типом данных меньшим диапазоном значений, перевоплощается в больший диапазон. Из этого следует вывод, что неявное преобразование, всегда имеет расширяющий тип.

Если в выражении присутствуют значения или переменные типов "char", "byte", "short" они преобразуются в тип "int", а если есть хотя бы один операнд с типом "long", то все выражение преобразуется в "long".

Неявное преобразование.
Неявное преобразование.

Примитивный тип "boolean" нельзя преобразовать в любой другой тип данных, аналогично и любой другой тип в "boolean" так же нельзя преобразовать.

Явное преобразование типов - это указание конкретного типа к которому мы хотим привести значение. Как правило, явное преобразование имеет сужающий тип, получается что мы из большего диапазона делаем меньший. Указывается с помощью целевого типа обрамленного в круглые скобки (byte), (int), (float) и так далее.

Явное преобразование.
Явное преобразование.

Рассмотрим пример, две переменные типа "byte", в "varByte2" хотим поместить результат от сложения переменной "varByte", но Java ругается, ей не нравится, так как Java результат автоматически преобразовала в тип "int" то есть расширила, но нам то нужен "byte", значит нужно указать явно, пробуем.

Ошибка.
Ошибка.

Указали у первого операнда, но не помогло, так как мы явно задаем тип у одного лишь операнда, хм, попробуем явно преобразовать и второй операнд? Пробуем.

Ошибка.
Ошибка.

Не получилось, а все потому что мы преобразовываем в "byte" переменные которые и так с типом "byte", а нам нужно преобразовать результат от сложения.

Ошибка.
Ошибка.

Значит, операнды берем в круглые скобки.

Java одобряет.
Java одобряет.

А что если мы превысим диапазон типа "byte", как тогда Java будет считать?

Попробуем рассчитать примеры на картинке. Итак, сумма переменных "varByte" равна 160, а максимальное значение "byte" составляет 127, Java сделает так: разделит 160 на две части, первая это максимальное значение диапазона равное 127 и вторая - это остаток 33, зная что у нас есть остаток, заберем единицу и добавим ее к первой части, после чего наше значение из максимального примет минимальное в диапазоне "byte" со сменой знака и примет значение -128, но остаток все еще есть 32, значит необходимо просуммировать первую и вторую части -128 + 32 = -96. Второй пример, в "byte" хотим пихнуть аж 255, делим на две части первая 127, вторая остаток 128, забираем у второй единичку и отдаем ее первой плюс смена знака, то есть первая теперь равна -128, а вторая 127, осталось просуммировать -128 + 127 = -1. И так с каждым значением примитивного типа вышедшим из диапазона.

Расчет значения вышедшего из диапазона.
Расчет значения вышедшего из диапазона.

Попробуй самостоятельно посчитать примеры на картинке снизу.

Самостоятельная работа
Самостоятельная работа

На этом все, до встречи в следующей статье.

статья №9 Java: Побитовые операторы(операторы присваивания + приоритет выполнения).

Поставь лайк если понравилась статья, тебе всего лишь "клик", а мне радости полные штаны =). Подписывайся на канал, будет много интересных публикаций =).