问题 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类型对象的引用。令我困惑的部分是代码的最后两行。根据我的理解,类型X的引用x1被赋予与y类型Y相同的引用。由于x1被赋予与y相同的引用,这意味着它从类型X转到Y,这将是向下转换。我读错了代码吗?


11611
2018-02-17 00:01


起源



答案:


你的类层次结构

Object
  |
  X
 / \
Y   Z

根据我的理解,类型X的引用x1被赋予相同的值   引用为y,类型为Y.由于x1被赋值为y   引用为y,表示它从X型到Y型   向下转换。我读错了代码吗?

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

你要分配 y 至 x1。您正在分配类型的引用 Y 到类型的引用 X。看看层次结构,你就会向上发展 upcast


8
2018-02-17 00:05



我喜欢你在视觉上解释这个的方式。 - Kevin Bowersox
这很清楚!我正以相反的方式阅读它。 - user3317186


答案:


你的类层次结构

Object
  |
  X
 / \
Y   Z

根据我的理解,类型X的引用x1被赋予相同的值   引用为y,类型为Y.由于x1被赋值为y   引用为y,表示它从X型到Y型   向下转换。我读错了代码吗?

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

你要分配 y 至 x1。您正在分配类型的引用 Y 到类型的引用 X。看看层次结构,你就会向上发展 upcast


8
2018-02-17 00:05



我喜欢你在视觉上解释这个的方式。 - Kevin Bowersox
这很清楚!我正以相反的方式阅读它。 - user3317186


当一个类型的实例 Y 要么 Z (子类)被视为基类型(超类) X 这是一个向上倾斜。

Upcast是隐式的(隐藏的),并导致派生类型被视为超类型。

这是一个向上的例子:

X x1 = y;

演员是隐含的(隐藏的),但可以被认为是:

X x1 = (X) y;

向下转换是从超类型到派生类型。所以要垂头丧气 x1 到类型 Y :

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

Downcast不是隐式的,必须明确声明。他们创造了一个潜力 ClassCastException 如果我们正在投射的实例不是我们要投射的类型。


3
2018-02-17 00:05



阅读“X x1 = y;”的正确方法是什么?我不认为我解释得对。 - user3317186
我会把它看成是一个例子 Y 命名 y 正被分配到 x1 哪种类型 X。在赋值期间,从类型发生隐式(隐藏)向上转换 Y 至 X。 - Kevin Bowersox


Y extends X表示您创建的对象 new Y() 将是Y类型,因此类型为X.因为一个派生自另一个而X是超类,所以Y类型的任何对象也是X类型。

例如,java中的所有类都派生自Object类,因此,String是一个字符串,也是一个Object。


0
2018-02-17 00:05





它是向上转换,因为你有一个Y类型的实例,它由类型X的变量引用,而X在类层次结构中是'up'(上面)。


0
2018-02-17 00:07