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 char → int 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 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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;
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 int → char 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().
GO TO FULL VERSION