Jetzt anmelden...

Name
Passwort
Registrieren

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?

Kommentare [0]

Stefan 22.06.2019

Infos zum Artikel

Kategorie Java
Autor Stefan
Datum 22.06.2019

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.

Kommentar schreiben

Nur angemeldete Benutzer können kommentieren.

Alle Kommentare

Es gibt bislang noch keine Kommentare zu diesem Thema.

switch/ case Anweisung

Benötigen wir eine Unterscheidung nach vielen Fällen empfehlen sich switch-case-Statements.

Java Variablen erklärt

Wie werden Variablen eingesetzt? Was bedeutet Deklarieren und Initialisieren?

Objekte vergleichen

Was ist der Unterschied zwischen == und equals()?

FALCONBYTE.NET

Handmade with 🖤️

© 2018, 2019 Stefan E. Heller

Impressum | Datenschutz

facebook programmieren lernen twitter programmieren lernen youtube programmieren lernen