Menu

Typumwandlung in Java: Erweiterung, Einschränkung und Konvertierungen

Wie Java zwischen Typen konvertiert: automatische Erweiterung, explizite einschränkende Casts, welche Daten beim Einschränken verloren gehen und das Konvertieren zwischen Zahlen und Strings.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Was Typumwandlung bedeutet

Java ist statisch typisiert: Jeder Wert hat einen Typ, und der Compiler lässt dich inkompatible Typen nicht stillschweigend vermischen. Die Typumwandlung ist die Art und Weise, wie du einen Wert von einem Typ in einen anderen konvertierst — manchmal macht Java es für dich, und manchmal musst du es explizit verlangen.

Es gibt zwei Richtungen. Von einem kleineren Typ zu einem größeren zu wechseln (ein int in ein double) ist sicher und geschieht automatisch. Von einem größeren Typ zu einem kleineren zu wechseln (ein double in ein int) kann Daten verlieren, daher zwingt dich Java, es mit einem Cast auszuschreiben.

Erweiterung: die automatische Konvertierung

Eine erweiternde Konvertierung verschiebt einen Wert in einen Typ mit mehr Platz. Es kann nichts verloren gehen, daher macht Java es für dich ohne Cast:

Die int-7 passt in ein double und wird zu 7.0. Die Erweiterungsreihenfolge für Zahlen ist byte -> short -> int -> long -> float -> double; eine Zuweisung von links nach rechts entlang dieser Kette benötigt nie einen Cast. Deshalb „funktioniert" das Mischen von Typen in der Arithmetik oft einfach — Java erweitert zuerst den kleineren Operanden.

Einschränkung: der explizite Cast

In die andere Richtung — eine einschränkende Konvertierung — können Daten verloren gehen, daher verweigert der Compiler dies, es sei denn, du setzt den Zieltyp in Klammern vor den Wert:

(int) pi ist der Cast. Achte darauf, was er macht: Er schneidet in Richtung Null ab und verwirft einfach den Nachkommateil. 3.9 wird zu 3, und -3.9 wird zu -3. Er rundet nicht. Wenn du runden möchtest, ist das ein anderes Werkzeug:

Zu vergessen, dass ein Cast abschneidet, ist einer der häufigsten Anfängerfehler — wenn deine „gerundete" Zahl immer um eins zu niedrig ist, liegt es meist daran.

Die Falle der Ganzzahldivision

In diese Falle tappt jeder einmal. Wenn beide Operanden int sind, führt der Operator / eine Ganzzahldivision durch und verwirft den Rest — bevor überhaupt eine Zuweisung an ein double erfolgt:

a / b ist 7 / 2, vollständig in int-Arithmetik berechnet, was 3 ergibt. Die anschließende Erweiterung zu double macht aus 3 nur 3.0 — die .5 ist bereits weg. Wenn man zuerst einen Operanden zu double castet ((double) a / b), zwingt das den gesamten Ausdruck in Gleitkomma und liefert das gewünschte 3.5. Du musst nur eine Seite casten; Java erweitert die andere passend dazu.

Wenn die Einschränkung überläuft

Ein Cast prüft nicht, ob der Wert hineinpasst. Wenn nicht, werden die Bits einfach abgeschnitten und du bekommst ein überraschendes Ergebnis — kein Fehler, keine Warnung:

300 passt nicht in ein byte, daher werden die höherwertigen Bits verworfen und du erhältst 44. Das ist „stiller" Datenverlust — das Programm läuft einwandfrei und liefert ein falsches Ergebnis. Schränke nur ein, wenn du sicher bist, dass der Wert in den kleineren Typ passt.

Konvertieren zwischen Zahlen und Strings

Ein String ist ein Objekt, keine Zahl, daher kannst du ihn nicht mit (int) casten — das ist ein Kompilierungsfehler. Für die Konvertierung gibt es stattdessen eigene Methoden:

Von Text zu einer Zahl verwendet man Integer.parseInt / Double.parseDouble. Ist der String keine gültige Zahl (etwa "hello"), werfen diese Methoden eine NumberFormatException. Von einer Zahl zu Text verwendest du String.valueOf(n) oder verkettest einfach mit "" — denn n + "" zwingt das int in einen String. Achte auf den Unterschied zwischen "5" + 1 (was den String "51" ergibt) und 5 + 1 (was 6 ergibt); das + bedeutet Verkettung, sobald ein String beteiligt ist.

Objekte casten

Casting gilt auch für Objektreferenzen, nicht nur für primitive Typen. Du kannst eine Referenz entlang einer Vererbungskette in einen verwandten Typ casten — die Erweiterung zu einem übergeordneten Typ ist automatisch, das Einschränken zurück nach unten benötigt einen expliziten Cast und ist nur sicher, wenn das Objekt wirklich von diesem Typ ist:

Object o = "hello";
String s = (String) o;        // OK: o verweist tatsächlich auf einen String
Integer bad = (Integer) o;    // kompiliert, wirft aber zur Laufzeit eine ClassCastException

Der zweite Cast kompiliert, fliegt aber zur Laufzeit mit einer ClassCastException auf, weil das Objekt ein String ist, kein Integer. Das wirst du richtig kennenlernen, sobald du zu Vererbung und Polymorphie kommst; für den Moment reicht es zu wissen, dass die (Type)-Syntax dieselbe Idee ist, angewendet auf Objekte.

Als Nächstes: if-else

Casting erlaubt dir, Werte umzuformen; der nächste Schritt ist, dein Programm anhand dieser Werte zwischen Pfaden wählen zu lassen. Die if-else-Anweisung führt einen Block aus, wenn eine Bedingung wahr ist, und einen anderen, wenn sie falsch ist — die Grundlage jeder Entscheidung, die dein Code trifft. Das ist die nächste Seite.

Häufig gestellte Fragen

Was ist Typumwandlung in Java?

Typumwandlung bedeutet, einen Wert von einem Datentyp in einen anderen zu konvertieren. Java führt kleine „erweiternde" Konvertierungen automatisch aus (etwa von int zu double), aber eine „einschränkende" Konvertierung, bei der Daten verloren gehen könnten (etwa von double zu int), erfordert einen expliziten Cast: int n = (int) 3.9;.

Wie wandelt man in Java ein double in ein int um?

Schreibe den Zieltyp in Klammern vor den Wert: int n = (int) 3.9;. Das schneidet in Richtung Null ab (verwirft den Nachkommateil), du erhältst also 3, nicht 4. Um stattdessen zu runden, verwende Math.round(3.9), was 4 zurückgibt.

Wie wandelt man in Java einen String in ein int um?

Ein String ist keine Zahl, daher kannst du ihn nicht mit (int) casten. Verwende Integer.parseInt("42"), um ein int zu erhalten, oder Double.parseDouble("3.14") für ein double. Ist der Text keine gültige Zahl, werfen diese Methoden eine NumberFormatException.

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S