Casting de classe en java
Dans mon code, deux classes sont là, la sous-classe s'étend superclass.In la sous - classe i remplace la méthode de superclasse. Au moment de la création de l'objet, j'ai créé une référence de superclasse à l'objet de sous-classe qui fonctionne bien. Mais encore une fois, j'ai converti la référence de super classe en objet de super classe complet, mais il appelle la méthode de sous-classe et non la méthode de super classe. Mon hypothèse la sortie est fausse.Voici mon code
public class OverRiding {
public static void main(String[] args) {
// TODO Auto-generated method stub
//Super class reference to sub class Object
Dog dog = new Animal();
dog.eat();
dog.bow();
//Completely converted into pure Dog class Object
Dog d = (Dog) dog;
d.eat();
d.bow();
}
}
Classe de chien
class Dog {
public void eat() {
System.out.println("Dog eat Biscuits");
}
public void bow() {
System.out.println("Dog bow");
}
}
Animal de classe
class Animal extends Dog {
public void eat() {
System.out.println("Animal eat Food");
}
}
Et ma sortie est
Animal eat Food
Dog bow
Animal eat Food
Dog bow
5 answers
Votre concept n'est pas correct bro...
class Animal extends Dog
Comment un animal peut-il étendre un chien? . C'est comme dire - "CHAQUE ANIMAL EST UN CHIEN" . Ce qui est faux... Donc, il devrait être dans l'autre sens...
Cet exemple ne fera que vous embrouiller davantage..
Donno pourquoi personne n'a évoqué cela...
Dog d = (Dog) dog;
Ici d
n'est pas pur Dog
objet. Il est toujours de type Animal
. L'objet pur Dog
serait créé via Dog d = new Dog()
.
Dog dog = new Animal();
//Completely converted into pure Dog class Object
Dog d = (Dog) dog;
Les deux Dog
et d
pointent vers la même référence, Puisque vous ne créez pas de nouveau object
. Le casting n'aura pas d'effet ici.
Le casting et la création sont complètement différents.
Dans cet exemple, vous avez créé un objet, et c'est un Animal
, (qui, malheureusement, est un type spécial de Dog
). Lorsque vous appelez eat
sur cet objet, vous obtiendrez toujours la version définie dans la classe Animal
, pas la version définie dans la classe Dog
.
C'est le polymorphisme. La version de la méthode appelée dépend de la classe de l'objet, pas du type de la variable qui lui fait référence.
Votre hypothèse est fausse:
Complètement converti en pur objet de classe de chien
Lorsque vous convertissez votre Animal
en Dog
, votre variable d est toujours un Animal
. C'est aussi un Dog
, mais le plus spécifique est de type Animal
.
Vous n'êtes pas complètement converti votre variable en une autre instance. Votre instance est toujours la même.
Pour preuve, vous pouvez essayer ce code :
Dog d = (Dog) dog;
d.getClass(); // output Animal