Upcast Java versus Downcast

J’ai le code suivant

class X{} class Y extends X{} class Z extends X{} public class RunTimeCastDemo{ public static void main(Ssortingng args[]){ X x = new X(); Y y = new Y(); Z z = new Z(); X x1 = y; // comstacks ok (y is subclass of X), upcast X x2 = z; // comstacks ok (z is subclass of X), upcast 

Le code ci-dessus m’a été donné dans une conférence. Je sais que X est la classe de base de Y et de Z. x est une référence à un object de type X, y est une référence à un object de type Y et z est une référence à un object de type Z. La partie qui me déroute est les deux dernières lignes du code. D’après ce que j’ai compris, la référence x1 de type X se voit atsortingbuer la même référence que y, le type Y. Puisque x1 est affecté à la même référence que y, cela signifie qu’il passe du type X à Y, ce qui serait une méthode de diffusion en aval. Est-ce que je lis mal le code?

Votre hiérarchie de classe

 Object | X / \ YZ 

D’après ce que j’ai compris, la référence x1 de type X se voit atsortingbuer la même référence que y, le type Y. Puisque x1 est affecté à la même référence que y, cela signifie qu’il passe du type X à Y, ce qui serait une méthode de diffusion en aval. Est-ce que je lis mal le code?

 X x1 = y; // comstacks ok (y is subclass of X), upcast 

Vous assignez y à x1 . Vous affectez une référence de type Y à une référence de type X En regardant la hiérarchie, vous allez vers le haut, donc vers le haut.

Lorsqu’une instance de type Y ou Z (sous-classe) est traitée comme type de base (superclasse) X il s’agit d’un upcast.

Les retransmissions en amont sont implicites (masquées) et font en sorte qu’un type dérivé soit traité comme un super type.

Voici un exemple de upcast:

 X x1 = y; 

Le casting est implicite (caché) mais pourrait être considéré comme:

 X x1 = (X) y; 

Un downcast va d’un type super à un type dérivé. Donc, pour downcast x1 au type Y :

 X x1 = y; Y y1 = (Y) x1; 

Les downcasts ne sont pas implicites et doivent être explicitement déclarés. Ils créent le potentiel pour une ClassCastException si l’instance que nous ClassCastException n’est pas du type que nous ClassCastException .

Y étend X signifie que les objects que vous créez avec le new Y() seront de type Y et par conséquent de type X. Parce que l’un dérive de l’autre et que X est la super classe, tout object de type Y est également de type X .

Par exemple, toutes les classes en java dérivent de la classe Object. Par conséquent, une chaîne est une chaîne et également un object.

Il est upcasting, car vous avez une instance de type Y qui est référencée par une variable de type X, et X est «up» (ci-dessus) dans la hiérarchie de classes.