我有以下代码
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,这将是向下转换。我读错了代码吗?
你的类层次结构
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
。
你的类层次结构
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
。
当一个类型的实例 Y
要么 Z
(子类)被视为基类型(超类) X
这是一个向上倾斜。
Upcast是隐式的(隐藏的),并导致派生类型被视为超类型。
这是一个向上的例子:
X x1 = y;
演员是隐含的(隐藏的),但可以被认为是:
X x1 = (X) y;
向下转换是从超类型到派生类型。所以要垂头丧气 x1
到类型 Y
:
X x1 = y;
Y y1 = (Y) x1;
Downcast不是隐式的,必须明确声明。他们创造了一个潜力 ClassCastException
如果我们正在投射的实例不是我们要投射的类型。
Y extends X表示您创建的对象 new Y()
将是Y类型,因此类型为X.因为一个派生自另一个而X是超类,所以Y类型的任何对象也是X类型。
例如,java中的所有类都派生自Object类,因此,String是一个字符串,也是一个Object。
它是向上转换,因为你有一个Y类型的实例,它由类型X的变量引用,而X在类层次结构中是'up'(上面)。