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
Таблиця неявних перетворень
| Звідки | Куди можна неявно перетворити |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Важливо: неявне перетворення працює лише у бік «розширення» (від меншого до більшого).
2. Явне (ручне) перетворення типів (type casting)
Явне перетворення потрібне, коли ви хочете перетворити значення з більшого типу на менший або між несумісними типами. У цьому випадку Java вимагає, щоб ви явно вказали, що ви усвідомлюєте можливу втрату даних.
Аналогія: намагаєтеся перелити воду з відра (double) у склянку (int) — частина води може пролитися, і Java вимагає, щоб ви сказали: «Так, я розумію, що частина даних може загубитися».
Синтаксис
тип_призначення змінна = (тип_призначення) вираз;
Приклад: 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().
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ