Java Upcast vs Downcast

时间:2014-02-17 00:01:36

标签: java inheritance

我有以下代码

    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,这将是向下转换。我读错了代码吗?

4 个答案:

答案 0 :(得分:8)

您的班级等级

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

答案 1 :(得分:3)

当类型为YZ(子类)的实例被视为基类型(超类)X时,这是一个向上翻译。

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

这是一个向上的例子:

X x1 = y;

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

X x1 = (X) y;

向下转换是从超类型到派生类型。所以要将x1转发给Y类型:

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

Downcast不是隐式的,必须明确声明。如果我们正在投射的实例不是我们所投射的类型,它们会为ClassCastException创造潜力。

答案 2 :(得分:0)

Y extends X意味着使用new Y()创建的对象将是Y类型,因此类型为X.因为一个派生自另一个而X是超类,所以Y类型的任何对象都是也是X型。

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

答案 3 :(得分:0)

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