我有以下代码
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,这将是向下转换。我读错了代码吗?
答案 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)
当类型为Y
或Z
(子类)的实例被视为基类型(超类)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'(上面)。