JavaRush/Курси/JAVA 25 SELF/Явне та неявне перетворення типів у Java

Явне та неявне перетворення типів у Java

Відкрита

1. Неявне (автоматичне) перетворення типів

У Java, як і в інших мовах програмування, змінні мають фіксований тип — якщо змінну оголошено як int, то вона може зберігати лише цілі числа, а якщо як double — лише числа з плаваючою комою. У реальних програмах часто потрібно передати значення зі змінної одного типу до змінної іншого типу. Наприклад:

  • Отримали з методу значення типу int, а хочемо використовувати його як double для обчислень із дробовими значеннями.
  • Зберігаємо код символу як число (int), а хочемо отримати сам символ (char).
  • Маємо результат обчислень типу double, а потрібне ціле число (int), наприклад, щоб вивести кількість цілих яблук.

У Java є два основні способи перетворення типів: неявне (автоматичне) та явне (ручне).

Що це таке?

Неявне перетворення — це коли Java сама, без вашої участі, перетворює значення з одного типу на інший, якщо це безпечно та не призводить до втрати даних.

Це відбувається, коли ви присвоюєте значення меншого типу змінній більшого типу. Наприклад: з int у double, з char у int, з float у double.

Аналогія: уявіть, що у вас є склянка води (int) та відро (double). Якщо перелити воду зі склянки у відро — нічого не проллється, усе поміститься. Java в таких випадках дозволяє автоматичне перетворення.

Приклад: int → double

int apples = 5;
double applesWeight = apples; // int автоматично перетворюється на double

System.out.println(applesWeight); // 5.0

Приклад: char → int

Кожен символ у Java — це число з таблиці Unicode. Тому перетворення char у int відбувається автоматично:

char letter = 'A';
int code = letter; // 'A' перетворюється на 65 (код символу в Unicode)

System.out.println(code); // 65

Таблиця неявних перетворень

Звідки Куди можна неявно перетворити
byte
short, int, long, float, double
short
int, long, float, double
char
int, long, float, double
int
long, float, double
long
float, double
float
double

Важливо: неявне перетворення працює лише у бік «розширення» (від меншого до більшого).

2. Явне (ручне) перетворення типів (type casting)

Явне перетворення потрібне, коли ви хочете перетворити значення з більшого типу на менший або між несумісними типами. У цьому випадку Java вимагає, щоб ви явно вказали, що ви усвідомлюєте можливу втрату даних.

Аналогія: намагаєтеся перелити воду з відра (double) у склянку (int) — частина води може пролитися, і Java вимагає, щоб ви сказали: «Так, я розумію, що частина даних може загубитися».

Синтаксис

тип_призначення змінна = (тип_призначення) вираз;
Синтаксис явного перетворення («cast»)

Приклад: double → int

double price = 12.99;
int roundedPrice = (int) price; // дробова частина відкидається

System.out.println(roundedPrice); // 12

Увага: це не округлення — дробова частина просто відкидається. Для округлення використовуйте Math.round().

Приклад: int → char

int code = 66;
char letter = (char) code; // 66 — це символ 'B'

System.out.println(letter); // B

Приклад: double → float

double d = 3.1415926535;
float f = (float) d; // частина точності втрачається

System.out.println(f); // 3.1415927 (менше знаків після коми)

3. Перетворення між числами та символами (char і числа)

Чому це можливо?

У Java символи (char) насправді — це числа з таблиці Unicode. Тому їх можна вільно перетворювати в int і навпаки.

Приклад: char → int

char ch = 'Ж';
int code = ch;

System.out.println(code); // 1046

Приклад: int → char

int code = 8364;
char symbol = (char) code;

System.out.println(symbol); // €

Практика: виведення алфавіту

for (int i = 65; i < 65 + 26; i++) {
    System.out.print((char) i + " ");
}
// Виведе: A B C D … Z

4. Перетворення між цілими та дійсними числами

int → double (неявно)

int count = 10;
double avg = count; // неявне розширення

System.out.println(avg); // 10.0

double → int (явно)

double score = 8.75;
int rounded = (int) score;

System.out.println(rounded); // 8

Як округлити за правилами математики?

Якщо потрібно не просто відкинути дробову частину, а округлити до найближчого цілого, використовуйте Math.round():

double price = 8.75;
int rounded = (int) Math.round(price);

System.out.println(rounded); // 9

5. Що відбувається під час «звуження» типу? Втрата даних

Приклад: int → byte

int big = 300;
byte small = (byte) big;

System.out.println(small); // 44

Чому 44? Тому що byte зберігає значення від -128 до 127, і якщо число не вміщується — відбувається відсікання за модулем 256 (береться залишок від ділення).

Приклад: double → int

double d = 1e20;
int i = (int) d;

System.out.println(i); // -2147483648 (мінімальне значення int)

Дуже велике число не вміщується в діапазон int, і результат може виглядати неочікувано.

6. Перетворення під час обчислень: «змішані» типи

Приклад: int + double

int a = 3;
double b = 2.5;
double result = a + b; // int автоматично перетвориться на double

System.out.println(result); // 5.5

Приклад: char + int

char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset);   // char автоматично перетворюється на int

System.out.println(next); // C

7. Перетворення між числами та рядками

Хоч це й не зовсім «перетворення типів», часто потрібно перетворити число на рядок і навпаки.

int → String

int x = 123;
String s = Integer.toString(x);
// або просто: String s = "" + x;

String → int

String s = "456";
int x = Integer.parseInt(s);

8. Типові помилки та нюанси

Помилка № 1: втрата дробової частини під час double → int. Дуже часто новачки думають, що (int) 3.99 дасть 4. Насправді результат — 3, дробова частина просто відкидається. Для правильного округлення використовуйте Math.round().

Помилка № 2: неявне «звуження» не працює. Не можна просто взяти й написати int x = 300; byte b = x; — компілятор видасть помилку. Потрібно явно вказати (byte) x, але будьте готові до неочікуваних результатів, якщо число перевищує діапазон byte.

Помилка № 3: перетворення між несумісними типами. Не можна написати (int) "123" — рядок у число потрібно перетворювати через Integer.parseInt().

Помилка № 4: проблеми з char і int. Перетворення int у char працює тільки для значень, визначених у Unicode. Якщо передати занадто велике число, результатом стане неочікуваний символ.

Помилка № 5: змішані типи у виразах. Якщо вираз містить int і double, результат завжди буде double. Це може неочікувано вплинути на логіку програми, якщо ви очікуєте ціле число.

Помилка № 6: округлення — це не перетворення типу! (int) x — це не округлення, а просто відсікання дробової частини. Для округлення використовуйте Math.round().

1
Задача
JAVA 25 SELF,  6 рівень,  5 лекція
Недоступна
Підрахунок цілих предметів із загальної маси 📦
Підрахунок цілих предметів із загальної маси 📦
1
Задача
JAVA 25 SELF,  6 рівень,  5 лекція
Недоступна
Перекодування секретних повідомлень для шпигуна 🕵️‍♀️
Перекодування секретних повідомлень для шпигуна 🕵️‍♀️
1
Задача
JAVA 25 SELF,  6 рівень,  5 лекція
Недоступна
Обмеження старих погодних датчиків 🌡️
Обмеження старих погодних датчиків 🌡️
1
Задача
JAVA 25 SELF,  6 рівень,  5 лекція
Недоступна
Обчислення середнього бала за змішаними предметами 🎓
Обчислення середнього бала за змішаними предметами 🎓
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.