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

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

JAVA 25 SELF
Рівень 6 , Лекція 5
Відкрита

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
Опитування
Дійсні числа, рівень 6, лекція 5
Недоступний
Дійсні числа
Дійсні числа і char
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ