Ein Leitfaden für Anfänger und Verständnis für die Typumwandlung in Java

Wir konvertieren ständig Daten von einem Typ in einen anderen. Wenn Sie beispielsweise Europa besuchen und ein Auto fahren, werden Sie wahrscheinlich im Kopf Kilometer pro Stunde in Meilen pro Stunde umrechnen, um ein besseres Gefühl dafür zu bekommen, wie schnell Sie fahren. Sie verwenden die Umrechnung auch, wenn Sie dort an einem Geldautomaten Euro statt Dollar abheben.

Die gleiche Idee gilt für die Programmiersprache Java. Alle Daten sind nach Typ kategorisiert, sodass Programme wissen, wie sie bei der Ausführung damit umgehen müssen. Abhängig davon, was ein Programm tun soll, müssen Sie jedoch gelegentlich die Kategorie der von Ihnen verwendeten Daten ändern. Dies ändert nichts an den Daten selbst – schließlich fährt ein Auto mit der gleichen Geschwindigkeit, unabhängig davon, ob sie in Kilometern oder Meilen pro Stunde gemessen wird –, sondern nur daran, wie sie referenziert werden.

Welche Datentypen gibt es in Java? Wie ändert man Datentypen? Auf all dies und noch mehr gehen wir weiter unten ein, während wir alles besprechen, was Sie über Typumwandlung in Java wissen müssen.

Schnelle Navigation
Java-DatentypenUpcasting in JavaDowncasting in JavaCast()-Methode Zusätzliche Ressourcen zur Typumwandlung in Java

Java-Datentypen

Java-Datentypen

In Java gibt es drei grundlegende Datenkategorien:

  • Wahr falsch
  • Textzeichen
  • Zahlen

In dieser Tabelle werden die spezifischen Datentypen innerhalb dieser Kategorien aufgeschlüsselt.

Kategorie Datentyp Enthält Größe

T/F boolescher Wert wahr oder falsch 1 Bit

Textzeichen Unicode-Textzeichen 16 Bit

Zahl Byte vorzeichenbehaftete Ganzzahl 8 Bit

Zahl kurze vorzeichenbehaftete Ganzzahl 16 Bit

Zahl int vorzeichenbehaftete Ganzzahl 32 Bit

Zahl lange vorzeichenbehaftete Ganzzahl 64 Bit

Zahl Float IEEE 754 Gleitkomma 32 Bit

Zahl Double IEEE 754 Gleitkomma 64 Bit

Jede Zahl kann problemlos von einer kleineren in eine größere Zahl verschoben werden, beispielsweise von einem 8-Bit-Byte in eine 16-Bit-Kurzgröße (oder mehr!), da Sie immer noch mit Daten in der Zahlenkategorie arbeiten. Sie müssen nicht einmal etwas tun, da Java diese Konvertierung implizit durchführt.

Andererseits können boolesche 1-Bit-Daten nicht automatisch in 16-Bit-Unicode konvertiert werden, obwohl sie von einer kleineren zu einer größeren Größe übergehen, da es sich um zwei unterschiedliche Datentypen handelt. Versucht ein Programm dies, wird automatisch eine Fehlermeldung generiert. Um dieses Problem zu vermeiden, müssen Sie diese Datentypen innerhalb des Programms, das Sie schreiben, explizit konvertieren.

Upcasting in Java

Das obige Beispiel, bei dem der Datentyp einer Zahl von einem Byte in einen Short-Datentyp umgewandelt wird, also von einer Unterklasse in eine Oberklasse, wird auch Upcasting genannt. Schauen wir uns an, wie das funktioniert, indem wir eine Klasse namens Trucks definieren:

Lastwagen der öffentlichen Klasse {

public void Fuel() {

// …

}

}

Danach können wir die Trucks-Klasse um Chevrolet erweitern:

Chevrolet der öffentlichen Klasse erweitert Trucks {

public void Fuel() {

// …

}

public void diesel() {

// …

}

}

Erstellen wir ein Chevrolet-Klassenobjekt und weisen ihm den Referenzvariablentyp Chevrolet zu:

Chevrolet Chevrolet = neuer Chevrolet();

Und wir können es auch der Referenzvariablen vom Typ Trucks zuweisen:

LKW LKW = Chevrolet;

Mit dem obigen Code müssen wir die Datentypen nicht explizit ändern, da ein implizites Upcasting erfolgt. Wenn wir dies explizit tun wollten, ist hier der Code:

Trucks = (Lkw) Chevrolet;

Beachten Sie: Zu diesem Zeitpunkt können wir diesel() nicht für die Variable Trucks aufrufen, da wir die folgende Compiler-Fehlermeldung erhalten würden:

// lkws.diesel(); Die Methode diesel() ist für den Typ Trucks undefiniert

Wir müssten die Lastkraftwagen herabsetzen, um auf Diesel umzusteigen, und darauf gehen wir weiter unten ein. Was das Upcasting betrifft, können wir jetzt jedoch Polymorphismus nutzen.

Polymorphismus

Von Polymorphismus spricht man, wenn verschiedene Mitglieder eine größere Gesamtgruppe bilden. Pennys, Dimes und Quarters sind beispielsweise verschiedene Mitglieder der Gesamtgruppe, die als Währung bekannt ist. Im Fall unseres Lkw-Beispiels können wir dank des Polytheismus eine weitere Unterklasse zu Lkw namens Ford hinzufügen:

öffentliche Klasse für Extends Trucks {

public void Fuel() {

// …

}

}

Anschließend definieren wir die Methode „fuel()“, um Chevrolets und Fords als LKWs zu kategorisieren:

öffentliche Klasse TruckGas {

public void Feed(List Trucks) {

Trucks.forEach(Truck -> {

lkw.kraftstoff();

});

}

}

TruckGas befasst sich weder mit Chevrolets noch mit Fords im Besonderen, da sich Lkw – und alle damit verbundenen Objekte – jetzt in der Methode „fuel()“ befinden.

Wenn wir bestimmte Objekttypen zur LKW-Liste hinzufügen, findet implizit ein Upcasting statt:

List Trucks = new ArrayList<>();

Trucks.add(neuer Chevrolet());

Trucks.add(neuer Ford());

new TruckGas().fuel(trucks)

Dank Polymorphismus ist jeder Chevrolet und Ford ein Lastwagen.

Überschreiben

Im obigen Code wurde die Methode „fuel()“ überschrieben. Während Fuel() für die Variable vom Typ Trucks aufgerufen wird, wird die Arbeit von Methoden ausgeführt, die für die tatsächlichen Objekte Chevrolets und Fords aufgerufen werden:

public void Feed(List Trucks) {

Trucks.forEach(Truck -> {

lkw.kraftstoff();

});

}

Wir können sehen, wie die Methoden für Chevrolets und Fords heißen, wenn wir die Protokollierung hinzufügen:

web – 23.07.2018 08:43:37.354 [main] INFO com.javabeat.casting.Chevrolet – Chevrolet tankt

web – 23.07.2018 08:43:37.363 [main] INFO com.javabeat.casting.Ford – Ford tankt

Downcasting in Java

Im Gegensatz zum Upcasting, bei dem eine Unterklasse in eine Superklasse umgewandelt wird, ist das Downcasting die entgegengesetzte Aktion: die Umwandlung einer Superklasse in eine Unterklasse. Und während ein Compiler implizit ein Upcast durchführt, müssen wir Code schreiben, der explizit ein Downcast durchführt. Schauen wir uns dieses Beispiel an:

LKW LKW = neuer Chevrolet();

Die LKW-Variable bezieht sich auf die Instanz Chevrolet. Nehmen wir also an, wir müssen die diesel()-Methode von Chevrolet für LKWs aufrufen. Der Compiler generiert jedoch eine Fehlermeldung, die besagt, dass die diesel()-Methode für den Typ Truck nicht existiert. Das bedeutet, dass wir Chevrolet dazu zwingen müssen, Diesel zu nennen:

((Chevrolet) LKW).diesel();

Jetzt schreiben wir das frühere TruckGas-Beispiel mit der diesel()-Methode um:

öffentliche Klasse TruckGas {

public void Feed(List Trucks) {

Trucks.forEach(Truck -> {

lkw.kraftstoff();

if (Truck-Instanz von Chevrolet) {

((Chevrolet) LKW).diesel();

}

});

}

}

An diesem Punkt können wir auf alle für die Chevrolet-Klasse verfügbaren Methoden zugreifen. Wir können das Protokoll überprüfen, um sicherzustellen, dass diesel() tatsächlich aufgerufen wird:

web – 23.07.2018 10:12:33.445 [main] INFO com.javabeat.casting.Chevrolet – Chevrolet tankt

web – 23.07.2018 10:12:33.454 [main] INFO com.javabeat.casting.Chevrolet – Diesel

web – 23.07.2018 10:12:33.455 [main] INFO com.javabeat.casting.Ford – Ford tankt

Instanz des Operators

Sie werden feststellen, dass wir im obigen Beispiel nur Objekte heruntergestuft haben, die Instanzen von Chevrolet sind. Deshalb haben wir dazu den Operator „instanceof“ verwendet:

if (Truck-Instanz von Chevrolet) {

((Chevrolet) LKW).diesel();

}

Cast()-Methode

Schließlich können wir auch die Klassenmethoden verwenden, um Objekttypen umzuwandeln:

public void whenDowncastToChevroletWithCastMethod_thenDieselIsCalled() {

LKW LKW = neuer Chevrolet();

if (Truck.class.isInstance(truck)) {

Chevrolet chevrolet = Chevrolet.class.cast(truck);

chevrolet.diesel();

}

}

Im obigen Code werden im Gegensatz zur Verwendung der Operatoren „cast“ und „instanceof“ die Methoden „cast()“ und „isInstance()“ verwendet. Dies geschieht am häufigsten bei der Verwendung generischer Typen.

Zusätzliche Ressourcen zur Typumwandlung in Java

Während wir die Grundlagen der Typumwandlung in Java besprochen haben, gibt es noch weitere Besonderheiten, mit denen Sie vertraut sein sollten. Ein Vorteil von Java als Open Source besteht darin, dass zahlreiche Referenzseiten und Tutorials verfügbar sind. Vor diesem Hintergrund sollten Sie sich diese kostenlosen Java-bezogenen Ressourcen ansehen.

Orakel

Beginnen Sie zunächst mit der Java-Dokumentation, die auf der Oracle-Website verfügbar ist. Insbesondere möchten Sie einen Blick darauf werfen Kapitel 5: Konvertierungen und Kontexte. Diese Informationen tauchen noch tiefer in die spezifischen Konventionen und Verwendungen von Casting und Identitätsumwandlung ein:

  • Erweiterung und Verengung primitiver Konvertierungen
  • Erweiterung und Einschränkung von Referenzkonvertierungen
  • Boxumbau
  • Unboxing-Konvertierung
  • ungeprüfte Konvertierung
  • Capture-Konvertierung
  • String-Konvertierung
  • Wertesatzkonvertierung
  • verbotene Konvertierungen

Außerdem erfahren Sie mehr über die verschiedenen Kontexte, in denen alle diese Konvertierungen funktionieren: Zuweisung, Aufruf, Zeichenfolge, Umwandlung und numerisch.

Breite Fähigkeiten

In diesem ausführlich Typumwandlung von Java-Objekten Im Tutorial werden Sie sowohl Upcasting als auch Downcasting anhand detaillierter Screenshots und Codebeispiele durchgehen. Außerdem werden die ClassCastException-Fehlermeldung und deren Vermeidung ausführlich besprochen. Sie haben auch die Möglichkeit, den gesamten als Beispiel verwendeten Quellcode herunterzuladen.

Auf der Wideskills-Website gibt es neben den zwanzig Tutorials zum Thema Java noch eine Vielzahl weiterer Tutorials zum Thema Codierung. Weitere Themenbereiche umfassen Microsoft-Programmierung, Programmierung mobiler Geräte, Datenbanken und mehr.

fresh2refresh

In dieser Vertiefung wird eine Vielzahl von Themen behandelt Java – Typkonvertierung und Casting Tutorial: Grund- und Referenzdatentypen, arithmetische Förderung, Zuweisungskonvertierung und Methodenaufrufkonvertierung. Darüber hinaus können Sie auf einen Online-Java-Compiler sowie auf andere Compiler wie C, C++, C#, Python und Ruby zugreifen.

Sie können sich auch die anderen Themenbereiche mit Tutorials ansehen: SQL, Unix, XML, C++, C und JSP. Die XML-Tutorialreihe behandelt beispielsweise zwölf verschiedene Themen wie Dokumenttypdefinitionen (DTDs), Entitäten sowie XLinks und XPointer.

Sowohl Upcasting als auch Downcasting sind leistungsstarke Vorgänge in Java, die Sie gründlich verstehen müssen, um Compiler-Fehlermeldungen zu vermeiden. Denken Sie daran: Während das Upcasting automatisch – also implizit – vom Compiler durchgeführt wird, müssen Sie Code schreiben, um Datentypen explizit herunterzuwandeln und die richtige Ausgabe zu generieren.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen