CodeGym /Kursy /JAVA 25 SELF /Jawne i niejawne przekształcanie typów w Java

Jawne i niejawne przekształcanie typów w Java

JAVA 25 SELF
Poziom 6 , Lekcja 5
Dostępny

1. Niejawna (automatyczna) konwersja typów

W Java (jak i w innych językach) zmienne mają ścisły typ — jeśli zmienna jest zadeklarowana jako int, to może przechowywać tylko liczby całkowite, a jeśli jako double — tylko liczby zmiennoprzecinkowe. Jednak w realnych programach często pojawia się sytuacja, gdy trzeba „przełożyć” wartość z jednej zmiennej do drugiej o innym typie. Na przykład:

  • Otrzymaliśmy z metody int, a chcemy użyć tego jako double do obliczeń z ułamkami.
  • Przechowujemy kod znaku jako liczbę (int), a chcemy uzyskać sam znak (char).
  • Mamy wynik obliczeń w double, a potrzebujemy wyniku całkowitego (int), na przykład aby wypisać liczbę całych jabłek.

W Javie są dwa główne sposoby przekształcania typów: niejawny (automatyczny) i jawny (ręczny).

Co to jest?

Niejawna konwersja to sytuacja, gdy Java sama, „bez twojego udziału”, przekształca wartość z jednego typu na inny, jeśli jest to bezpieczne i nie prowadzi do utraty danych.

Dzieje się tak, gdy przypisujesz wartość typu mniejszego do zmiennej typu większego. Na przykład z int do double, z char do int, z float do double.

Analogia: Wyobraź sobie, że masz szklankę wody (int) i wiadro (double). Jeśli przelejesz wodę ze szklanki do wiadra — nic się nie wyleje, wszystko się zmieści. Java w takich przypadkach pozwala na automatyczną konwersję.

Przykład: int double

int apples = 5;
double applesWeight = apples; // int automatycznie staje się double

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

Przykład: char int

Każdy znak w Java to po prostu liczba z tablicy Unicode. Dlatego konwersja char do int zachodzi automatycznie:

char letter = 'A';
int code = letter; // 'A' zamienia się w 65 (kod znaku w Unicode)

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

Tabela niejawnych konwersji

Z Do (niejawnie)
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

Ważne: Niejawna konwersja działa tylko w stronę „rozszerzania” (od mniejszego do większego).

2. Jawne (ręczne) rzutowanie typów (type casting)

Jawne rzutowanie jest wymagane, gdy chcesz przekształcić wartość z typu większego do mniejszego lub między typami niekompatybilnymi. W takim przypadku Java wymaga, abyś wyraźnie wskazał, że masz świadomość możliwej utraty danych.

Analogia: Próbujesz przelać wodę z wiadra (double) do szklanki (int) — część wody może się wylać i Java wymaga, abyś powiedział: „Tak, rozumiem, że część danych może się zgubić!”

Składnia


target_type variable = (target_type) expression;
Składnia jawnego rzutowania (cast)

Przykład: double int

double price = 12.99;
int roundedPrice = (int) price; // część ułamkowa jest po prostu odcinana!

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

Uwaga: Nie następuje zaokrąglenie! Po prostu „ucinamy” wszystko po kropce. Do zaokrąglania użyj Math.round().

Przykład: int char

int code = 66;
char letter = (char) code; // 66 to znak 'B'

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

Przykład: double float

double d = 3.1415926535;
float f = (float) d; // część precyzji się traci

System.out.println(f); // 3.1415927 (mniej cyfr po przecinku)

3. Konwersja między liczbami a znakami (char i liczby)

Dlaczego to możliwe?

W Java znaki (char) to w istocie zwykłe liczby z tablicy Unicode. Dlatego można je swobodnie przekształcać do int i odwrotnie.

Przykład: char int

char ch = '\u0416';
int code = ch;

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

Przykład: int char

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

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

Praktyka: wypisujemy alfabet

for (int i = 65; i < 65 + 26; i++) {
    System.out.print((char) i + " ");
}
// Wypisze: A B C D ... Z

4. Konwersja między liczbami całkowitymi i zmiennoprzecinkowymi

int double (niejawnie)

int count = 10;
double avg = count; // niejawne poszerzenie

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

double int (jawnie)

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

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

Jak zaokrąglić zgodnie z zasadami matematyki?

Jeśli trzeba nie tylko „odciąć” część ułamkową, ale zaokrąglić do najbliższej liczby całkowitej, użyj Math.round():

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

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

5. Co się dzieje przy „zawężaniu” typu? Utrata danych

Przykład: int byte

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

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

Dlaczego 44? Ponieważ byte przechowuje wartości od -128 do 127, a gdy liczba się nie mieści — następuje „obcięcie” modulo 256 (reszta z dzielenia).

Przykład: double int

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

System.out.println(i); // -2147483648 (minimalna wartość int)

Duża liczba nie mieści się w zakresie int i wynik staje się „dziwny”.

6. Konwersja w obliczeniach: „mieszane” typy

Przykład: int + double

int a = 3;
double b = 2.5;
double result = a + b; // int automatycznie stanie się double

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

Przykład: char + int

char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset);   // char automatycznie stanie się int

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

7. Konwersja między liczbami i łańcuchami

Chociaż to nie całkiem „rzutowanie typów”, często zachodzi potrzeba przekształcić liczbę w łańcuch i odwrotnie.

int String

int x = 123;
String s = Integer.toString(x);
// albo po prostu: String s = "" + x;

String int

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

8. Typowe błędy i niuanse

Błąd nr 1: Utrata części ułamkowej przy double int. Bardzo często początkujący myślą, że (int) 3.99 da 4. W rzeczywistości wynik to 3 — część ułamkowa jest po prostu odrzucana. Do poprawnego zaokrąglania użyj Math.round().

Błąd nr 2: Niejawne „zawężanie” nie działa. Nie można ot tak napisać int x = 300; byte b = x; — kompilator zgłosi błąd. Trzeba jawnie wskazać (byte) x, ale bądź gotów na dziwne wyniki, jeśli liczba przekracza zakres byte.

Błąd nr 3: Konwersja między niekompatybilnymi typami. Nie można napisać (int) "123" — łańcuch na liczbę trzeba konwertować przez Integer.parseInt().

Błąd nr 4: Problemy z char i int. Konwersja int do char działa tylko dla wartości, które rzeczywiście istnieją w Unicode. Jeśli przekażesz dużą liczbę, wynik będzie nieoczekiwanym znakiem.

Błąd nr 5: Mieszane typy w wyrażeniach. Jeśli wyrażenie zawiera int i double, wynik zawsze będzie double. Może to nieoczekiwanie wpłynąć na logikę programu, jeśli oczekujesz liczby całkowitej.

Błąd nr 6: Zaokrąglanie to nie rzutowanie typu! (int) x to nie zaokrąglanie, a tylko odrzucenie części ułamkowej. Do zaokrąglania użyj Math.round().

1
Ankieta/quiz
Liczby zmiennoprzecinkowe, poziom 6, lekcja 5
Niedostępny
Liczby zmiennoprzecinkowe
Liczby zmiennoprzecinkowe i char
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION