Upcasting und Downcasting sind wichtige Bestandteile von Java, die es uns ermöglichen, komplizierte Programme mit einfacher Syntax zu erstellen, und bieten uns große Vorteile wie Polymorphismus oder das Gruppieren verschiedener Objekte. Mit Java kann ein Objekt eines Unterklassentyps als Objekt eines beliebigen Oberklassentyps behandelt werden. Dies wird als Upcasting bezeichnet. Das Upcasting erfolgt automatisch, während das Downcasting manuell vom Programmierer durchgeführt werden muss , und ich werde mein Bestes geben, um zu erklären, warum das so ist.
Upcasting und Downcasting sind NICHT wie das Casting von Grundelementen von einem zum anderen, und ich glaube, das ist es, was viel Verwirrung stiftet, wenn der Programmierer anfängt, das Casting von Objekten zu lernen.
Polymorphismus: Alle Methoden in Java sind standardmäßig virtuell. Dies bedeutet, dass jede Methode bei der Vererbung überschrieben werden kann, es sei denn, diese Methode ist als endgültig oder statisch deklariert .
Im folgenden Beispiel sehen Sie, wie getType();
je nach Objekttyp (Hund, Haustier, Polizeihund) funktioniert.
Angenommen, Sie haben drei Hunde
Hund - Dies ist die Superklasse.
Haustierhund - Haustierhund erweitert Hund.
Polizeihund - Polizeihund erweitert Haustierhund.
public class Dog{
public String getType () {
System.out.println("NormalDog");
return "NormalDog";
}
}
/**
* Pet Dog has an extra method dogName()
*/
public class PetDog extends Dog{
public String getType () {
System.out.println("PetDog");
return "PetDog";
}
public String dogName () {
System.out.println("I don't have Name !!");
return "NO Name";
}
}
/**
* Police Dog has an extra method secretId()
*/
public class PoliceDog extends PetDog{
public String secretId() {
System.out.println("ID");
return "ID";
}
public String getType () {
System.out.println("I am a Police Dog");
return "Police Dog";
}
}
Polymorphismus: Alle Methoden in Java sind standardmäßig virtuell. Dies bedeutet, dass jede Methode bei der Vererbung überschrieben werden kann, es sei denn, diese Methode ist als endgültig oder statisch deklariert. (Erläuterung gehört zum Konzept der virtuellen Tabellen)
Virtuelle Tabelle / Versandtabelle: Die Versandtabelle eines Objekts enthält die Adressen der dynamisch gebundenen Methoden des Objekts. Methodenaufrufe werden ausgeführt, indem die Adresse der Methode aus der Versandtabelle des Objekts abgerufen wird. Die Versandtabelle ist für alle Objekte derselben Klasse gleich und wird daher normalerweise von ihnen gemeinsam genutzt.
public static void main (String[] args) {
/**
* Creating the different objects with super class Reference
*/
Dog obj1 = new Dog();
` /**
* Object of Pet Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry about it
*
*/
Dog obj2 = new PetDog();
` /**
* Object of Police Dog is created with Dog Reference since
* Upcasting is done automatically for us we don't have to worry
* about it here even though we are extending PoliceDog with PetDog
* since PetDog is extending Dog Java automatically upcast for us
*/
Dog obj3 = new PoliceDog();
}
obj1.getType();
Druckt Normal Dog
obj2.getType();
Druckt Pet Dog
obj3.getType();
Druckt Police Dog
Das Downcasting muss vom Programmierer manuell durchgeführt werden
Wenn Sie versuchen, die secretID();
Methode aufzurufen , für obj3
die in der Hierarchie eine Superklasse angegeben ist PoliceDog object
, auf die jedoch verwiesen wird, Dog
wird ein Fehler ausgegeben, da obj3
Sie keinen Zugriff auf die secretId()
Methode haben. Um diese Methode aufzurufen, müssen Sie das Objekt manuell auf Downcast übertragen PoliceDog
( (PoliceDog)obj3).secretID();
welche druckt ID
Ähnlich wie beim Aufrufen der dogName();
Methode in der PetDog
Klasse, auf die Sie einen Downcast durchführen müssen obj2
, PetDog
da auf obj2 verwiesen wird Dog
und Sie keinen Zugriff auf die dogName();
Methode haben
( (PetDog)obj2).dogName();
Warum ist das so, dass das Upcasting automatisch erfolgt, das Downcasting jedoch manuell erfolgen muss? Sie sehen, Upcasting kann niemals scheitern. Aber wenn Sie eine Gruppe von verschiedenen Hunde haben und wollen sie alle ein , um ihre Typen niedergeschlagenen, dann gibt es eine Chance, dass einige dieser Hunde sind tatsächlich von verschiedenen Typen dh PetDog
, PoliceDog
und fehlschlägt, durch das Werfen ClassCastException
.
Dies ist der Grund, warum Sie Ihre Objekte manuell herabstufen müssen, wenn Sie Ihre Objekte auf den Superklassentyp verwiesen haben.
Hinweis: Wenn Sie hier referenzieren, bedeutet dies, dass Sie die Speicheradresse Ihrer Objekte beim Downcasting nicht ändern. Sie bleiben jedoch unverändert. In diesem Fall gruppieren Sie sie nur nach einem bestimmten Typ Dog
Dog
ist einAnimal
. In den meisten Fällen ist ein Upcasting nicht erforderlich, es sei denn, Sie möchten eine bestimmte überladene Methode verwenden.callme
existiert in beidenAnimal
undDog
.callme2
nur existiert inDog
, was Sie werfena
zuDog
machen , um es zu arbeiten.