CodeGym /Kurse /JAVA 25 SELF /Explizite und implizite Typumwandlung in Java

Explizite und implizite Typumwandlung in Java

JAVA 25 SELF
Level 6 , Lektion 5
Verfügbar

1. Implizite (automatische) Typumwandlung

In Java (wie in anderen Sprachen auch) haben Variablen einen strengen Typ – ist eine Variable als int deklariert, kann sie nur ganze Zahlen speichern, und bei double – nur Gleitkommazahlen. In realen Programmen entsteht jedoch oft die Situation, dass man einen Wert von einer Variablen in eine andere mit einem anderen Typ „umfüllen“ muss. Zum Beispiel:

  • Aus einer Methode kommt ein int, wir möchten ihn aber als double für Berechnungen mit Nachkommastellen verwenden.
  • Wir speichern den Zeichencode als Zahl (int), möchten aber das eigentliche Zeichen (char) erhalten.
  • Es gibt ein Ergebnis als double, wir brauchen jedoch einen Ganzzahlwert (int), z. B. um die Anzahl ganzer Äpfel auszugeben.

In Java gibt es zwei grundlegende Arten der Typumwandlung: die implizite (automatische) und die explizite (manuelle).

Was bedeutet das?

Implizites Casting bedeutet, dass Java selbst, „ohne Ihr Zutun“, einen Wert von einem Typ in einen anderen umwandelt, wenn das sicher ist und zu keinem Datenverlust führt.

Das geschieht, wenn Sie einer Variablen mit größerem Typ einen Wert eines kleineren Typs zuweisen. Zum Beispiel von int nach double, von char nach int, von float nach double.

Analogie: Stellen Sie sich ein Glas Wasser (int) und einen Eimer (double) vor. Wenn Sie Wasser vom Glas in den Eimer gießen, geht nichts verloren – alles passt hinein. In solchen Fällen erlaubt Java die automatische Umwandlung.

Beispiel: int double

int apples = 5;
double applesWeight = apples; // int wird automatisch zu double

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

Beispiel: char int

Jedes Zeichen in Java ist einfach eine Zahl aus der Unicode-Tabelle. Daher erfolgt die Umwandlung charint automatisch:

char letter = 'A';
int code = letter; // 'A' wird zu 65 (Zeichencode in Unicode)

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

Tabelle der impliziten Umwandlungen

Von Wohin implizit möglich
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

Wichtig: Implizite Umwandlung funktioniert nur in Richtung „Erweiterung“ (vom kleineren zum größeren).

2. Explizite (manuelle) Typumwandlung (type casting)

Explizite Umwandlung ist erforderlich, wenn Sie einen Wert von einem größeren in einen kleineren Typ oder zwischen inkompatiblen Typen konvertieren möchten. In diesem Fall verlangt Java, dass Sie ausdrücklich angeben, dass Ihnen ein möglicher Datenverlust bewusst ist.

Analogie: Sie versuchen, Wasser aus einem Eimer (double) in ein Glas (int) zu gießen – ein Teil könnte verschüttet werden, und Java verlangt, dass Sie sagen: „Ja, mir ist klar, dass dabei Daten verloren gehen können!“

Syntax


target_type variable = (target_type) expression;
Syntax des expliziten Casts (cast)

Beispiel: double int

double price = 12.99;
int roundedPrice = (int) price; // der Nachkommateil wird einfach abgeschnitten!

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

Achtung: Es findet keine Rundung statt! Es wird einfach alles nach dem Dezimalpunkt „abgehackt“. Zum Runden verwenden Sie Math.round().

Beispiel: int char

int code = 66;
char letter = (char) code; // 66 ist das Zeichen 'B'

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

Beispiel: double float

double d = 3.1415926535;
float f = (float) d; // ein Teil der Genauigkeit geht verloren

System.out.println(f); // 3.1415927 (weniger Nachkommastellen)

3. Umwandlung zwischen Zahlen und Zeichen (char und Zahlen)

Warum ist das möglich?

In Java sind Zeichen (char) eigentlich nur Zahlen aus der Unicode-Tabelle. Daher lassen sie sich frei in int und umgekehrt umwandeln.

Beispiel: char int

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

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

Beispiel: int char

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

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

Praxis: Alphabet ausgeben

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

4. Umwandlung zwischen Ganzzahlen und Gleitkommazahlen

int double (implizit)

int count = 10;
double avg = count; // implizite Erweiterung

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

double int (explizit)

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

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

Wie rundet man nach mathematischen Regeln?

Wenn Sie den Nachkommateil nicht einfach „abschneiden“, sondern auf die nächste ganze Zahl runden möchten, verwenden Sie Math.round():

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

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

5. Was passiert bei einer „Verengung“ des Typs? Datenverlust

Beispiel: int byte

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

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

Warum 44? Weil byte Werte von -128 bis 127 speichert, und wenn die Zahl nicht hineinpasst – erfolgt ein „Abschneiden“ modulo 256 (Rest der Division).

Beispiel: double int

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

System.out.println(i); // -2147483648 (Minimalwert von int)

Die große Zahl passt nicht in den Wertebereich von int, und das Ergebnis wird „merkwürdig“.

6. Umwandlung bei Berechnungen: „gemischte“ Typen

Beispiel: int + double

int a = 3;
double b = 2.5;
double result = a + b; // int wird automatisch zu double

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

Beispiel: char + int

char ch = 'A'; // 65
int offset = 2;
char next = (char) (ch + offset);   // char wird automatisch zu int

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

7. Umwandlung zwischen Zahlen und Strings

Auch wenn dies nicht ganz eine „Typumwandlung“ ist, muss man oft eine Zahl in einen String und zurück umwandeln.

int String

int x = 123;
String s = Integer.toString(x);
// oder einfach: String s = "" + x;

String int

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

8. Typische Fehler und Feinheiten

Fehler Nr. 1: Verlust des Nachkommateils bei double int. Anfänger denken sehr oft, dass (int) 3.99 eine 4 ergibt. Tatsächlich ist das Ergebnis 3, der Nachkommateil wird einfach abgeschnitten. Für korrektes Runden verwenden Sie Math.round().

Fehler Nr. 2: Implizite „Verengung“ funktioniert nicht. Man kann nicht einfach int x = 300; byte b = x; – der Compiler meldet einen Fehler. Sie müssen ausdrücklich (byte) x angeben, aber seien Sie auf seltsame Ergebnisse gefasst, wenn die Zahl außerhalb des Wertebereichs von byte liegt.

Fehler Nr. 3: Umwandlung zwischen inkompatiblen Typen. Man kann nicht (int) "123" schreiben – einen String in eine Zahl wandelt man über Integer.parseInt() um.

Fehler Nr. 4: Probleme mit char und int. Die Umwandlung intchar funktioniert nur für Werte, die tatsächlich in Unicode existieren. Wenn Sie eine große Zahl übergeben, erhalten Sie ein unerwartetes Zeichen.

Fehler Nr. 5: Gemischte Typen in Ausdrücken. Wenn ein Ausdruck int und double enthält, ist das Ergebnis immer double. Das kann die Programmlogik unerwartet beeinflussen, wenn Sie ein Ganzzahlergebnis erwarten.

Fehler Nr. 6: Runden ist keine Typumwandlung! (int) x ist kein Runden, sondern nur das Abschneiden des Nachkommateils. Zum Runden verwenden Sie Math.round().

1
Umfrage/Quiz
Gleitkommazahlen, Level 6, Lektion 5
Nicht verfügbar
Gleitkommazahlen
Gleitkommazahlen und char
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION