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 - "вверх" (вверху) в иерархии классов.