Was ist der Unterschied zwischen Up-Casting und Down-Casting in Bezug auf die Klassenvariable?
Zum Beispiel in der folgenden Programmklasse enthält Animal nur eine Methode, aber die Dog-Klasse enthält zwei Methoden, wie wir dann die Dog-Variable in die Animal-Variable umwandeln.
Wenn das Casting abgeschlossen ist, wie können wir dann die andere Methode des Hundes mit der Variablen Animal aufrufen?
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
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.Antworten:
Upcasting wird in einen Supertyp umgewandelt, während Downcasting in einen Subtyp umgewandelt wird. Upcasting ist immer erlaubt, aber Downcasting beinhaltet eine Typprüfung und kann ein werfen
ClassCastException
.In Ihrem Fall ist eine Besetzung von a
Dog
nach aAnimal
ein Upcast, weil aDog
is-a istAnimal
. Im Allgemeinen können Sie Upcasts senden, wenn zwischen zwei Klassen eine Beziehung besteht.Downcasting wäre ungefähr so:
Im Grunde , was Sie tun , ist es, den Compiler zu sagen , dass Sie wissen , was der Laufzeittyp des Objekts wirklich ist. Der Compiler lässt die Konvertierung zu, fügt jedoch weiterhin eine Laufzeitprüfung ein, um sicherzustellen, dass die Konvertierung sinnvoll ist. In diesem Fall ist die Umwandlung möglich, da zur Laufzeit
animal
tatsächlich eineDog
, obwohl der statische Typ vonanimal
istAnimal
.Wenn Sie dies jedoch tun würden:
Du würdest eine bekommen
ClassCastException
. Der Grund dafür ist, dassanimal
der Laufzeit-Typ istAnimal
. Wenn Sie also der Laufzeit sagen, dass sie die Besetzung ausführen soll, sieht sie, dass diesanimal
nicht wirklich ein ist,Dog
und wirft daher einenClassCastException
.Um die Methode einer Oberklasse aufzurufen, können Sie dies tun
super.method()
oder den Upcast ausführen.Um die Methode einer Unterklasse aufzurufen, müssen Sie einen Downcast durchführen. Wie oben gezeigt, riskieren Sie normalerweise ein Risiko,
ClassCastException
indem Sie dies tun. Mit deminstanceof
Operator können Sie jedoch den Laufzeittyp des Objekts überprüfen, bevor Sie die Umwandlung durchführen. Auf diese Weise können Sie verhindern, dassClassCastException
s:quelle
ClassCastException
oder nicht? Wie im ersten Fall?Downcasting und Upcasting waren wie folgt:
Upcasting : Wenn wir eine Unterklasse in eine Superklasse umwandeln möchten, verwenden wir Upcasting (oder Verbreiterung). Es geschieht automatisch, ohne dass explizit etwas unternommen werden muss.
Downcasting : Wenn wir eine Super-Klasse in eine Sub-Klasse umwandeln möchten, verwenden wir Downcasting (oder Verengung), und Downcasting ist in Java nicht direkt möglich, dies müssen wir explizit tun.
quelle
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.
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)
Druckt
Normal Dog
Druckt
Pet Dog
Druckt
Police Dog
Das Downcasting muss vom Programmierer manuell durchgeführt werden
Wenn Sie versuchen, die
secretID();
Methode aufzurufen , fürobj3
die in der Hierarchie eine Superklasse angegeben istPoliceDog object
, auf die jedoch verwiesen wird,Dog
wird ein Fehler ausgegeben, daobj3
Sie keinen Zugriff auf diesecretId()
Methode haben. Um diese Methode aufzurufen, müssen Sie das Objekt manuell auf Downcast übertragenPoliceDog
welche druckt
ID
Ähnlich wie beim Aufrufen der
dogName();
Methode in derPetDog
Klasse, auf die Sie einen Downcast durchführen müssenobj2
,PetDog
da auf obj2 verwiesen wirdDog
und Sie keinen Zugriff auf diedogName();
Methode habenWarum 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 WerfenClassCastException
.Dies ist der Grund, warum Sie Ihre Objekte manuell herabstufen müssen, wenn Sie Ihre Objekte auf den Superklassentyp verwiesen haben.
quelle
Ich weiß, dass diese Frage vor ziemlich langer Zeit gestellt wurde, aber für die neuen Benutzer dieser Frage. Bitte lesen Sie diesen Artikel, der eine vollständige Beschreibung zum Upcasting, Downcasting und zur Verwendung der Instanz des Operators enthält
Es ist nicht erforderlich, manuell zu senden, es geschieht von selbst:
Mammal m = (Mammal)new Cat();
ist gleichMammal m = new Cat();
Downcasting muss jedoch immer manuell erfolgen:
Warum ist das so, dass das Upcasting automatisch erfolgt, das Downcasting jedoch manuell erfolgen muss? Sie sehen, Upcasting kann niemals scheitern. Wenn Sie jedoch eine Gruppe verschiedener Tiere haben und diese alle auf eine Katze herabstürzen möchten, besteht die Möglichkeit, dass einige dieser Tiere tatsächlich Hunde sind und der Prozess fehlschlägt, indem Sie ClassCastException auslösen. Hier sollte eine nützliche Funktion namens "instanceof" eingeführt werden , die testet, ob ein Objekt eine Instanz einer Klasse ist.
Für weitere Informationen lesen Sie bitte diesen Artikel
quelle
Versuchen Sie diese Methode besser für das Upcasting, es ist leicht zu verstehen:
quelle
Vielleicht hilft dieser Tisch. Aufruf der
callme()
Methode der KlasseParent
oder KlasseChild
. Grundsätzlich gilt:quelle
1.- Upcasting.
Bei einem Upcasting definieren Sie ein Tag eines Typs, das auf ein Objekt eines Subtyps verweist (Typ und Subtyp können als Klasse und Unterklasse bezeichnet werden, wenn Sie sich wohler fühlen ...).
Was bedeutet, dass ein solches Tag, animalCat, nur die Funktionalität (die Methoden) vom Typ Animal hat, da wir es als Typ Animal deklariert haben, nicht als Typ Cat.
Wir dürfen dies auf "natürliche / implizite / automatische" Weise tun, zur Kompilierungszeit oder zur Laufzeit, hauptsächlich weil Cat einen Teil seiner Funktionalität von Animal erbt. Zum Beispiel move (). (Zumindest ist Katze ein Tier, nicht wahr?)
2. Downcasting.
Aber was würde passieren, wenn wir die Funktionalität von Cat von unserem Typ Animal-Tag erhalten möchten?
Da wir das animalCat-Tag erstellt haben, das auf ein Cat-Objekt verweist, benötigen wir eine Möglichkeit, die Cat-Objektmethoden von unserem animalCat-Tag aus auf intelligente Weise aufzurufen.
Ein solches Verfahren nennen wir Downcasting und können es nur zur Laufzeit ausführen.
Zeit für Code:
quelle
Elternteil: Auto
Kind: Figo
Auto c1 = neues Figo ();
=====
Upcasting: -
Methode: Objekt c1 bezieht sich auf Methoden der Klasse (Figo - Methode muss überschrieben werden), da die Klasse "Figo" mit "new" angegeben ist.
Instanzvariable: Objekt c1 bezieht sich auf die Instanzvariable der Deklarationsklasse ("Auto").
Wenn die Deklarationsklasse übergeordnet ist und ein Objekt aus einem Kind erstellt wird, erfolgt ein implizites Casting, das "Upcasting" ist.
======
Downcasting: -
Figo f1 = (Figo) c1; //
Methode: Objekt f1 bezieht sich auf die Methode der Klasse (figo), da das ursprüngliche Objekt c1 mit der Klasse "Figo" erstellt wird. Sobald das Abwärtsgießen abgeschlossen ist, können Methoden, die nur in der Klasse "Figo" vorhanden sind, auch mit der Variablen f1 bezeichnet werden.
Instanzvariable: Objekt f1 bezieht sich nicht auf die Instanzvariable der Deklarationsklasse des Objekts c1 (Deklarationsklasse für c1 ist CAR), aber beim Downcasting bezieht es sich auf Instanzvariablen der Klasse Figo.
======
Verwendung: Wenn das Objekt zur untergeordneten Klasse gehört und die Deklarationsklasse übergeordnet ist und die untergeordnete Klasse auf die Instanzvariable ihrer eigenen Klasse und nicht der übergeordneten Klasse zugreifen möchte, kann dies mit "Downcasting" durchgeführt werden.
quelle
Upcasting bedeutet, das Objekt in einen Supertyp umzuwandeln, während Downcasting das Umwandeln in einen Subtyp bedeutet.
In Java ist kein Upcasting erforderlich, da dies automatisch erfolgt. Und es wird normalerweise als implizites Casting bezeichnet. Sie können es angeben, um es anderen klar zu machen.
Also schreiben
oder
führt zu genau der gleichen Stelle und in beiden Fällen wird die auszuführende
callme()
ausDog
.Downcasting ist stattdessen erforderlich, da Sie
a
als Objekt von Animal definiert haben. Derzeit wissen Sie, dass es ein istDog
, aber Java hat keine Garantie dafür. Eigentlich könnte es zur Laufzeit anders sein und Java wird ein werfenClassCastException
, würde das passieren. Natürlich ist dies bei Ihrem Beispiel nicht der Fall. Wenn Sie nicht werfen würdea
aufAnimal
, java konnte nicht einmal die Anwendung kompiliert , daAnimal
keine Methode habencallme2()
.In Ihrem Beispiel können Sie nicht den Code erreichen
callme()
vonAnimal
ausUseAnimlas
(weilDog
überschreiben) , es sei denn das Verfahren wie folgt sein würde:quelle
Wir können ein Objekt für Downcasting erstellen. In diesem Typ auch. : Aufruf der Basisklassenmethoden
quelle