Java Upcast против Downcast

У меня есть следующий код

    class X{} 
class Y extends X{} 
class Z extends X{} 

public class RunTimeCastDemo{ 
 public static void main(String args[]){ 
 X x = new X(); 
 Y y = new Y(); 
 Z z = new Z(); 


 X x1 = y; // compiles ok (y is subclass of X), upcast 
 X x2 = z; // compiles ok (z is subclass of X), upcast 

Этот код был приведен мне на лекции. Я знаю, что X является базовым классом как Y, так и Z. x является ссылкой на объект типа X, y является ссылкой на объект типа Y, а z является ссылкой на объект типа Z. Часть, которая меня путает, - это две последние строки кода. По моему мнению, эталон x1 типа X присваивается той же ссылке, что и y, которая является типом Y. Так как x1 присваивается той же ссылке, что и y, это означает, что она идет от типа X к Y, который будет downcasting. Я читаю код неправильно?

Ответ 1

Ваша иерархия классов

Object
  |
  X
 / \
Y   Z

Из моего понимания, ссылка x1 типа X назначается тем же ссылка как y, которая является типом Y. Поскольку x1 присваивается тому же как y, это означает, что он переходит от типа X к Y, который будет понижающее приведение. Я читаю код неправильно?

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

Назначение y x1. Вы присваиваете ссылку типа y ссылке типа X. Глядя на иерархию, вы поднимаетесь вверх, таким образом upcast.

Ответ 2

Если экземпляр типа Y или Z (подкласс) рассматривается как базовый тип (суперкласс) X, это является upcast.

Upcasts являются неявными (скрытыми) и приводят к тому, что производный тип обрабатывается как супер-тип.

Это пример повышения:

X x1 = y;

Приведение неявно (скрыто), но может считаться:

X x1 = (X) y;

Отбрасывается от супер-типа к производному типу. Итак, чтобы down down x1 к типу Y:

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

Внушители не являются неявными и должны быть явно объявлены. Они создают потенциал для ClassCastException, если экземпляр, который мы выполняем, не относится к типу, который мы выполняем.

Ответ 3

Y extends X означает, что объекты, созданные вами с помощью new Y(), будут иметь тип Y и, следовательно, тип X. Поскольку один происходит от другого, а X - суперкласс, любой объект, который имеет тип Y, также имеет тип X.

Например, все классы в java происходят из класса Object, поэтому String является строкой, а также объектом.

Ответ 4

Это повышается, потому что у вас есть экземпляр типа Y, на который ссылается переменная типа X, а X - "вверх" (вверху) в иерархии классов.