L'upgrade e il downcasting sono una parte importante di Java, che ci consente di creare programmi complicati utilizzando una sintassi semplice e ci offre grandi vantaggi, come il polimorfismo o il raggruppamento di oggetti diversi. Java consente a un oggetto di un tipo di sottoclasse di essere trattato come un oggetto di qualsiasi tipo di superclasse. Questo si chiama upcasting. L'upcasting viene eseguito automaticamente, mentre il downcasting deve essere eseguito manualmente dal programmatore e sto per dare il massimo per spiegare perché.
L'upcasting e il downcasting NON sono come il lancio di primitive dall'una all'altra, e credo che questo sia ciò che provoca molta confusione, quando il programmatore inizia a imparare a lanciare oggetti.
Polimorfismo: tutti i metodi in Java sono virtuali per impostazione predefinita. Ciò significa che qualsiasi metodo può essere ignorato se utilizzato in eredità, a meno che tale metodo non sia dichiarato come definitivo o statico .
Di seguito puoi vedere come getType();
funziona in base al tipo di oggetto (Cane, Animale domestico, Cane poliziotto).
Supponi di avere tre cani
Cane - Questa è la super classe.
Pet Dog - Pet Dog estende Dog.
Cane poliziotto - Cane poliziotto estende il cane da compagnia.
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";
}
}
Polimorfismo: tutti i metodi in Java sono virtuali per impostazione predefinita. Ciò significa che qualsiasi metodo può essere ignorato se utilizzato in eredità, a meno che tale metodo non sia dichiarato come definitivo o statico (Spiegazione appartiene al concetto di tabelle virtuali)
Tabella virtuale / Tabella di invio: la tabella di invio di un oggetto conterrà gli indirizzi dei metodi associati dinamicamente all'oggetto. Le chiamate al metodo vengono eseguite recuperando l'indirizzo del metodo dalla tabella di invio dell'oggetto. La tabella di invio è la stessa per tutti gli oggetti appartenenti alla stessa classe ed è quindi generalmente condivisa tra di loro.
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();
stampe Normal Dog
obj2.getType();
stampe Pet Dog
obj3.getType();
stampe Police Dog
Il downcasting deve essere eseguito manualmente dal programmatore
Quando si tenta di invocare il secretID();
metodo su obj3
cui si fa PoliceDog object
riferimento ma Dog
che è una super classe nella gerarchia, viene generato un errore poiché obj3
non si ha accesso al secretId()
metodo. Per invocare quel metodo è necessario eseguire il Downcast di obj3 manualmente PoliceDog
( (PoliceDog)obj3).secretID();
quale stampa ID
In modo simile a invocare il dogName();
metodo nella PetDog
classe che si bisogno di downcast obj2
al PetDog
dato obj2 è riferito a Dog
e non hanno accesso a dogName();
metodo
( (PetDog)obj2).dogName();
Perché è così, che l'upcasting è automatico, ma il downcasting deve essere manuale? Bene, vedi, l'upgrade non può mai fallire. Ma se si dispone di un gruppo di diversi cani e vuole a tutti loro downcast ad un a loro tipi, poi c'è una possibilità, che alcuni di questi cani sono in realtà di diversi tipi IE, PetDog
, PoliceDog
, e il processo fallisce, lanciando ClassCastException
.
Questo è il motivo per cui devi eseguire il downcast manuale dei tuoi oggetti se hai fatto riferimento ai tuoi oggetti al tipo di superclasse.
Nota: qui facendo riferimento significa che non stai modificando l'indirizzo di memoria dei tuoi oggetti espulsi quando lo annulli, rimane sempre lo stesso, li stai solo raggruppando in un tipo particolare in questo caso Dog
Dog
è unAnimal
. La maggior parte delle volte l'upgrade non è necessario a meno che non si desideri utilizzare un determinato metodo sovraccarico.callme
esiste in entrambiAnimal
eDog
.callme2
esiste solo inDog
, che si esegue il casta
perDog
per farlo funzionare.