L'upcasting et downcasting sont une partie importante de Java, qui nous permet de construire des programmes compliqués en utilisant une syntaxe simple, et nous donne de grands avantages, comme le polymorphisme ou le regroupement d'objets différents. Java permet à un objet d'un type de sous-classe d'être traité comme un objet de n'importe quel type de superclasse. C'est ce qu'on appelle l'upcasting. L'upcasting est fait automatiquement, tandis que downcasting doit être fait manuellement par le programmeur , et je vais faire de mon mieux pour expliquer pourquoi.
L'upcasting et le downcasting ne sont PAS comme la conversion de primitives de l'une à l'autre, et je crois que c'est ce qui cause beaucoup de confusion, lorsque le programmeur commence à apprendre à lancer des objets.
Polymorphisme: toutes les méthodes de java sont virtuelles par défaut. Cela signifie que toute méthode peut être remplacée lorsqu'elle est utilisée dans l'héritage, à moins que cette méthode ne soit déclarée comme finale ou statique .
Vous pouvez voir l'exemple ci-dessous comment getType();
fonctionne selon le type d'objet (chien, animal domestique, chien policier).
Supposons que vous ayez trois chiens
Chien - C'est la super classe.
Pet Dog - Pet Dog étend le chien.
Police Dog - Police Dog étend Pet Dog.
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";
}
}
Polymorphisme: toutes les méthodes de java sont virtuelles par défaut. Cela signifie que toute méthode peut être remplacée lorsqu'elle est utilisée dans l'héritage, sauf si cette méthode est déclarée comme finale ou statique. (Explication appartient au concept de tables virtuelles)
Table virtuelle / table de répartition: La table de répartition d'un objet contiendra les adresses des méthodes liées dynamiquement de l'objet. Les appels de méthode sont effectués en récupérant l'adresse de la méthode dans la table de répartition de l'objet. La table de répartition est la même pour tous les objets appartenant à la même classe et est donc généralement partagée entre eux.
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();
Tirages Normal Dog
obj2.getType();
Tirages Pet Dog
obj3.getType();
Tirages Police Dog
Le downcasting doit être effectué manuellement par le programmeur
Lorsque vous essayez d'appeler la secretID();
méthode sur obj3
laquelle est PoliceDog object
référencée mais à Dog
laquelle est une super-classe dans la hiérarchie, cela génère une erreur car vous obj3
n'avez pas accès à la secretId()
méthode. Afin d'appeler cette méthode, vous devez downcast manuellement cet obj3 pour PoliceDog
( (PoliceDog)obj3).secretID();
qui imprime ID
Dans la même manière d'invoquer la dogName();
méthode PetDog
classe , vous devez downcaster obj2
à PetDog
depuis obj2 est référencé Dog
et ne pas avoir accès à la dogName();
méthode
( (PetDog)obj2).dogName();
Pourquoi est-ce ainsi, que la conversion ascendante est automatique, mais que la prévision descendante doit être manuelle? Eh bien, vous voyez, l'upcasting ne peut jamais échouer. Mais si vous avez un groupe de chiens différents et que vous voulez les downcaster tous à leurs types, alors il y a une chance, que certains de ces chiens sont en fait de différents types iE, PetDog
, PoliceDog
et le processus échoue, en jetant ClassCastException
.
C'est la raison pour laquelle vous devez réduire manuellement vos objets si vous avez référencé vos objets au type de super classe.
Remarque: Ici, le référencement signifie que vous ne changez pas l'adresse mémoire de vos objets lorsque vous le downcastez, il reste toujours le même, vous les regroupez simplement dans un type particulier dans ce cas Dog
Dog
est unAnimal
. La plupart du temps, la conversion ascendante n'est pas nécessaire, sauf si vous souhaitez utiliser une certaine méthode surchargée.callme
existe à la fois dansAnimal
etDog
.callme2
seulement existe dansDog
, que vous lanceza
àDog
faire fonctionner.