it-swarm.com.de

Was ist der Unterschied zwischen Up-Casting und Down-Casting hinsichtlich der Klassenvariablen?

Was ist der Unterschied zwischen Up-Casting und Down-Casting bezüglich der Klassenvariablen?

In der folgenden Programmklasse beispielsweise enthält Animal nur eine Methode, die Dog-Klasse enthält jedoch zwei Methoden. Anschließend wird angegeben, wie die Dog-Variable in die Animal-Variable umgewandelt wird.

Wenn das Casting abgeschlossen ist, wie können wir dann die andere Methode des Hundes mit der Variable von 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();
    }
}
107
Dhivakar

Beim Upcasting wird ein Supertyp angewendet, beim Downcasting wird ein Subtyp verwendet. Upcasting ist immer erlaubt, aber Downcasting beinhaltet eine Typprüfung und kann ein ClassCastException werfen.

In Ihrem Fall ist ein Cast von Dog in Animal eine Aktualisierung, da Dog-a Animal ist. Im Allgemeinen können Sie Upcasts durchführen, wenn eine Beziehung zwischen zwei Klassen besteht.

Downcasting wäre ungefähr so:

Animal animal = new Dog();
Dog castedDog = (Dog) animal;

Im Grunde teilen Sie dem Compiler mit, dass Sie wissen, wie der Laufzeit-Typ des Objekts ist ja wirklich ist. Der Compiler lässt die Konvertierung zu, fügt jedoch weiterhin eine Laufzeitüberprüfung ein, um sicherzustellen, dass die Konvertierung sinnvoll ist. In diesem Fall ist die Umwandlung möglich, da animal zur Laufzeit tatsächlich Dog ist, obwohl der statische Typ von animalAnimal ist.

Wenn Sie dies jedoch tun würden:

Animal animal = new Animal();
Dog notADog = (Dog) animal;

Sie würden eine ClassCastException bekommen. Der Grund dafür ist, dass der Laufzeittyp von animalAnimal ist. Wenn Sie also der Laufzeitumgebung sagen, dass sie den Cast ausführen soll, wird animal nicht wirklich ein Dog und wirft ein ClassCastException aus.

Um die Methode einer Superklasse aufzurufen, können Sie super.method() oder den Upcast ausführen.

Um die Methode einer Unterklasse aufzurufen, müssen Sie einen Downcast ausführen. Wie oben gezeigt, riskieren Sie normalerweise eine ClassCastException. Sie können jedoch den Operator instanceof verwenden, um den Laufzeittyp des Objekts zu überprüfen, bevor Sie die Umwandlung durchführen. So können Sie ClassCastExceptions verhindern:

Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
    // Guaranteed to succeed, barring classloader shenanigans
    Dog castedDog = (Dog) animal;
}
166
awksp

Downcasting und Upcasting waren wie folgt:
 enter image description here

Upcasting: Wenn wir eine Unterklasse in eine Superklasse umwandeln wollen, verwenden wir Upcasting (oder Verbreiterung). Dies geschieht automatisch, es ist keine Notwendigkeit, explizit etwas zu tun. 

Downcasting: Wenn wir eine Superklasse in eine Unterklasse umwandeln möchten, verwenden wir Downcasting (oder Einengung) und Downcasting ist in Java nicht direkt möglich. 

Dog d = new Dog();
Animal a = (Animal) d; //Explicitly you have done upcasting. Actually no need, we can directly type cast like Animal a = d; compiler now treat Dog as Animal but still it is Dog even after upcasting
d.callme();
a.callme(); // It calls Dog's method even though we use Animal reference.
((Dog) a).callme2(); // Downcasting: Compiler does know Animal it is, In order to use Dog methods, we have to do typecast explicitly.
// Internally if it is not a Dog object it throws ClassCastException
44
Premraj

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 Gruppierung verschiedener Objekte. Java erlaubt es, ein Objekt eines Unterklassentyps als Objekt eines beliebigen Oberklassentyps zu behandeln. Dies nennt man Upcasting. 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 Gießen von Primitiven von einem zum anderen, und ich glaube, das sorgt für viel Verwirrung, wenn der Programmierer anfängt, das Gießen von Objekten zu lernen.

Polymorphismus: Alle Methoden in Java sind standardmäßig virtuell. Dies bedeutet, dass jede Methode bei der Verwendung in der Vererbung überschrieben werden kann, sofern diese Methode nicht als deklariert ist final oder static .

Das folgende Beispiel zeigt, wie getType(); entsprechend dem Objekttyp (Dog, Pet, Police Dog) funktioniert.

Angenommen, Sie haben drei Hunde

  1. Hund - Das ist die Superklasse.
  2. Haustierhund - Haustierhund verlängert Hund.
  3. 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 Verwendung in der Vererbung überschrieben werden kann, es sei denn, diese Methode ist als final oder static 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 Dispatch-Tabelle des Objekts abgerufen wird. Die Dispatch-Tabelle ist für alle Objekte der gleichen Klasse gleich und wird daher in der Regel von beiden 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

Downcasting muss vom Programmierer manuell durchgeführt werden

Wenn Sie versuchen, die secretID(); -Methode für obj3 Aufzurufen, die PoliceDog object Ist, aber auf Dog verweist, eine Superklasse in der Hierarchie, die seitdem einen Fehler auslöst obj3 Haben keinen Zugriff auf die secretId() -Methode . Um diese Methode aufzurufen, müssen Sie das obj3 manuell auf PoliceDog

  ( (PoliceDog)obj3).secretID();

welche druckt ID

Um die dogName(); -Methode in der PetDog -Klasse aufzurufen, müssen Sie obj2 Auf PetDog zurücksetzen, da obj2 auf Dog verweist. und habe keinen Zugriff auf die dogName(); Methode

  ( (PetDog)obj2).dogName();

Warum ist das so, dass Upcasting automatisch erfolgt, Downcasting jedoch manuell erfolgen muss? Nun, sehen Sie, Upcasting kann niemals scheitern. Aber wenn Sie eine Gruppe von verschiedenen Hunden haben und sie alle auf ihren Typ heruntertragen möchten, besteht die Möglichkeit, dass einige dieser Hunde tatsächlich von einem anderen Typ sind, dh PetDog, PoliceDog und der Prozess schlägt fehl, indem ClassCastException geworfen wird.

Aus diesem Grund müssen Sie Ihre Objekte manuell heruntertragen , wenn Sie Ihre Objekte auf den Superklassentyp bezogen haben.

Hinweis: Wenn Sie hier referenzieren, bedeutet dies, dass Sie die Speicheradresse Ihrer Objekte nicht ändern, wenn Sie sie downcasten. Sie bleiben jedoch gleich. In diesem Fall gruppieren Sie sie einfach zu einem bestimmten Typ. Dog

31

Ich kenne diese Frage schon vor langer Zeit, aber für die neuen Benutzer dieser Frage ... Bitte lesen Sie diesen Artikel, der eine vollständige Beschreibung zum Upcasting, Downcasting und zur Verwendung des instanceof - Operators enthält 

  • Es ist keine manuelle Aktualisierung erforderlich, dies geschieht von alleine:

    Mammal m = (Mammal)new Cat(); entspricht Mammal m = new Cat();

  • Das Downcasting muss jedoch immer manuell erfolgen:

    Cat c1 = new Cat();      
    Animal a = c1;      //automatic upcasting to Animal
    Cat c2 = (Cat) a;    //manual downcasting back to a Cat
    

Warum ist das so, dass das Upcasting automatisch ist, das Downcasting jedoch manuell erfolgen muss? Sie sehen, Upcasting kann niemals scheitern. Wenn Sie jedoch eine Gruppe verschiedener Tiere haben und sie alle auf eine Katze herabsetzen möchten, besteht die Chance, dass einige dieser Tiere tatsächlich Hunde sind und der Prozess durch das Auslösen von ClassCastException ..__ fehlschlägt. Hier sollten Sie etwas einführen eine nützliche Funktion namens "instanceof", die prüft, ob ein Objekt eine Instanz einer Klasse ist.

 Cat c1 = new Cat();         
    Animal a = c1;       //upcasting to Animal
    if(a instanceof Cat){ // testing if the Animal is a Cat
        System.out.println("It's a Cat! Now i can safely downcast it to a Cat, without a fear of failure.");        
        Cat c2 = (Cat)a;
    }

Für weitere Informationen lesen Sie bitte diesen Artikel

Versuchen Sie besser diese Methode für das Upcasting, es ist leicht zu verstehen:

/* upcasting problem */
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) 
    {
        Animal animal = new Animal ();
        Dog dog = new Dog();
        Animal ref;
        ref = animal;
        ref.callme();
        ref = dog;
        ref.callme();
    }
}
6
UWAIS

Vielleicht hilft diese Tabelle . Aufrufen der callme()-Methode der Klasse Parent oder der Klasse Child. Prinzipiell:

UPCASTING -> Verstecken

DOWNCASTING -> Aufschlussreich

enter image description here

enter image description here

enter image description here

5
Alexis

Elternteil: Auto
.__ Kind: Figo
Auto c1 = neue Figo ();

=====
Upcasting: -
Methode: Objekt c1 verweist auf Methods of Class (Figo - Methode muss überschrieben werden), da die Klasse "Figo" mit "new" angegeben wird.
Instanzvariable: Objekt c1 verweist auf die Instanzvariable der Deklarationsklasse ("Car"). 

Wenn die Deklarationsklasse übergeordnet ist und das Objekt als untergeordnetes Objekt erstellt wird, erfolgt eine implizite Umwandlung ("Upcasting"). 

======
Downcasting: -
Figo f1 = (Figo) c1; //
Methode: Das Objekt f1 bezieht sich auf die Methode der Klasse (figo), da das Anfangsobjekt c1 mit der Klasse "Figo" erstellt wird. Nach dem Down Casting können jedoch auch Methoden, die nur in der Klasse "Figo" vorhanden sind, mit der Variablen f1 bezeichnet werden.
Instanzvariable: Objekt f1 bezieht sich nicht auf Instanzvariable der Deklarationsklasse von Objekt c1 (Deklarationsklasse für c1 ist CAR), aber beim Down Casting bezieht es sich auf Instanzvariablen der Klasse Figo. 

======
Verwendung: Wenn Objekt eine untergeordnete Klasse ist und die Deklarationsklasse übergeordnet ist und die untergeordnete Klasse auf die Instanzvariable ihrer eigenen Klasse und nicht auf die übergeordnete Klasse zugreifen möchte, kann dies mit "Downcasting" erfolgen. 

2
amit shah

1.- Upcasting.

Bei einem Upcasting definieren Sie Sie definieren ein Tag eines Typs, das auf ein Objekt eines Subtyps zeigt (Typ und Subtyp können als Klasse und Unterklasse bezeichnet werden, wenn Sie sich wohler fühlen ...).

Animal animalCat = new Cat();

Was bedeutet, dass dieses Tag animalCat nur die Funktionalität (die Methoden) des Typs Animal hat, weil wir es als Type Animal deklariert haben, nicht als Typ Cat.

Wir dürfen dies auf "natürliche/implizite/automatische" Weise tun, zur Kompilierzeit oder zur Laufzeit, hauptsächlich weil Cat einige seiner Funktionen 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 bekommen müssen?.

Da wir das animalCat-Tag erstellt haben, das auf ein Cat-Objekt zeigt, benötigen wir eine Möglichkeit, die Cat-Objektmethoden von unserem animalCat-Tag auf eine intelligente Weise aufzurufen.

Ein solches Verfahren nennen wir Downcasting, und wir können es nur zur Laufzeit tun.

Zeit für etwas Code:

public class Animal {
    public String move() {
        return "Going to somewhere";
    }
}

public class Cat extends Animal{
    public String makeNoise() {
        return "Meow!";
    }   
}

public class Test {

    public static void main(String[] args) {

    //1.- Upcasting 
    //  __Type_____tag________object
        Animal animalCat = new Cat();
    //Some animal movement
        System.out.println(animalCat.move());
        //prints "Going to somewhere"

    //2.- Downcasting   
    //Now you wanna make some Animal noise.
        //First of all: type Animal hasn't any makeNoise() functionality.
        //But Cat can do it!. I wanna be an Animal Cat now!!

        //___________________Downcast__tag_____ Cat's method
        String animalNoise = ( (Cat) animalCat ).makeNoise();

        System.out.println(animalNoise);
        //Prints "Meow!", as cats usually done.

    //3.- An Animal may be a Cat, but a Dog or a Rhinoceros too.
        //All of them have their own noises and own functionalities.
        //Uncomment below and read the error in the console:

    //  __Type_____tag________object
        //Cat catAnimal = new Animal();

    }

}
2
Lemmy_Caution

upcasting bedeutet, dass das Objekt in einen Supertyp umgewandelt wird, während Downcasting bedeutet, dass es sich um einen Untertyp handelt.

In Java ist keine Aktualisierung 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

Animal a = (Animal)d;

oder

Animal a = d;

führt zu genau demselben Punkt und in beiden Fällen wird die callme() von Dog ausgeführt.

Downcasting ist stattdessen notwendig, da Sie a als Objekt von Animal definiert haben. Momentan wissen Sie, dass es sich um eine Dog handelt, aber Java hat keine Garantie dafür. Tatsächlich kann es zur Laufzeit anders sein und Java würde eine ClassCastException werfen, wenn das passieren würde. Natürlich trifft dies nicht auf Ihr Beispiel zu. Wenn Sie a nicht in Animal konvertieren würden, könnte Java die Anwendung nicht kompilieren, da Animal die Methode callme2() nicht hat.

In Ihrem Beispiel können Sie den Code von callme() von Animal nicht von UseAnimlas erreichen (da Dog ihn überschreibt), es sei denn, die Methode wäre wie folgt:

class Dog extends Animal 
{ 
    public void callme()
    {
        super.callme();
        System.out.println("In callme of Dog");
    }
    ... 
} 
1
David

Wir können Objekte für das Downcasting erstellen. In dieser Art auch. : Aufrufen der Basisklassenmethoden 

Animal a=new Dog();
a.callme();
((Dog)a).callme2();
0
Rakesh