10276 Views 6

credit: ©jayyuan/ stock.adobe

Java Blog

Unterschied explizites und implizites Casting

Typumwandlung (Casting) brauchen wir sowohl bei primitiven als auch bei komplexen Datentypen regelmäßig. Doch was ist eigentlich der Unterschied zwischen implizitem und explizitem Casting?

Falconbyte unterstüzen

Betrieb und Pflege von Falconbyte brauchen viel Zeit und Geld. Um dir auch weiterhin hochwertigen Content anbieten zu können, kannst du uns sehr gerne mit einem kleinen "Trinkgeld" unterstützen.

Thema in Kurzform

  • Implizites Casting: Kein Operator notwendig und wird von Java automatisch erledigt
  • Explizites Casting: Wir müssen "von Hand" die Typumwandlung mithilfe des Cast-Operators durchführen.

// Beispiele für explizites Casting:
double zahl = 7.9;
int zahl2 = (int) zahl;

Planet p = new Mars();
Mars m = (Mars) p;

bei primitiven Datentypen

implizites Casting

Ein Beispiel klärt das Wesentliche:

int zahl = 10;
System.out.println(zahl); // 10
double zahl2 = zahl; // casten
System.out.println(zahl2); // 10.0

Wir weisen in der dritten Zeile den Wert der int-Variable (10) der Variablen zahl2 zu. Da zahl2 den Datentyp double hat, gibt es keinerlei Probleme, denn ein int-Wert passt natürlich locker in einen double.

Da der Wert in eine double-Variable gesteckt wird, muss er auch zu einem double-Wert umgewandelt werden. Diese Typumwandlung geschieht automatisch. Da Java das für uns erledigt und wir nichts weiter tun müssen, nennt man diese Typumwandlung implizit.

Explizites Casting

Umgekehrt ist das anders. Hier ein Beispiel:

double zahl = 7.9;
int zahl2 = zahl; // error

Wir können einen double-Wert nicht in eine int-Variable stecken; das passt einfach nicht rein und der Compiler meldet: Incompatible types!

Hier muss nun der Programmierer eingriffen und mit einem Cast-Operator die Typumwandlung vornehmen. Da dies "von Hand" geschieht, also "ausdrücklich", nennt man den Vorgang explizit. Und so läuft das ab:

double zahl = 7.9;
int zahl2 = (int) zahl;  // casten
System.out.println(zahl2); // 7

Um zu casten, schreiben wir den Zieltyp in runde Klammern. Aber vorsicht: Diese Typumwandlung bewirkt einen Datenverlust (double > int), sodass wir alle Informationen nach dem Fließkomma verlieren (aus 7.9 wird 7).

bei Referenzen

implizites Casting

Wie bei den primtiven Typen geschieht das implizite Casten bei Referenztypen automatisch:

Mars m = new Mars();
Planet p = m; // casten

In der ersten Zeile erzeugen wir ein neues Objekt der Klasse Mars und weisen es der Referenzvariablen m vom Typ Mars zu.

In der nächsten Zeile erfolgt das implizite Casting, indem das Objekt der Referenz p vom Typ Planet zugewiesen wird. Dies funktioniert problemlos, da Planet eine Superklasse von Mars ist.

Es werden hier keine Objekte gecasted. Das Mars-Objekt selbst bekommt von all dem garnichts mit und bleibt völlig unangetastet.

Wir müssen aber bedenken, dass wir mit der Referenz p nur auf diejenigen Methoden Zugriff haben, die auch in Planet implementiert sind. Die Mars-typischen Methoden sind über p nicht mehr verfügbar (mehr erfahren).

explizites Casting

Die Tymumwandlung nach "unten" kann nicht automatisch geschehen, sondern erfolgt durch den Programmierer explizit.

Wir brauchen hier wieder den Cast-Operator. Er besteht wie gehabt aus zwei runden Klammern und darin der Name des Zieltyps. Zum Beispiel:

Planet p = new Mars();
Mars m = (Mars) p;

Beide Referenzen p und m verweisen auf dasselbe Objekt. Aber nur m hat vollen Zugriff darauf.

Kompatibel fürs Casting sind natürlich nur Typen, zwischen denen eine Vererbungsbeziehung besteht.

Java lernen

text text

PHP Lernen

zur PHP

JavaScript lernen

move nove move

FALCONBYTE.NET

Handmade with 🖤️

© 2018-2023 Stefan E. Heller

Impressum | Datenschutz | Changelog

Falconbyte Youtube Falconbyte GitHub facebook programmieren lernen twitter programmieren lernen discord programmieren lernen