Java向上转型与向下转型

11
我有以下代码
    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个回答

8

你的类层次结构

Object
  |
  X
 / \
Y   Z

据我理解,类型为X的参考x1被分配了与类型为Y的y相同的参考。由于x1被分配到与y相同的引用上,这意味着它从类型X向Y转换,也就是向下转换。我的代码理解有误吗?
X x1 = y; // compiles ok (y is subclass of X), upcast 

您将y分配给x1。 您正在将Y类型的引用分配给X类型的引用。 从继承层次结构看,您正在向上移动,因此进行了向上转型(upcast)


我喜欢你用视觉方式解释这个的方式。 - Kevin Bowersox

3

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

向上转型是隐式的(隐藏的),会导致派生类型被视为超类型。

这是一个向上转型的示例:

X x1 = y;

这里的cast是隐式的,但可以理解为:

X x1 = (X) y;

下行转换是从超类型到派生类型的。因此,要将 x1 向下转换为类型 Y

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

下行转换不是隐式的,必须明确声明。如果我们要转换的实例不是我们要转换到的类型,则会导致ClassCastException的潜在可能。


读取 "X x1 = y;" 的正确方式是什么?我认为自己理解有误。 - user3317186
我会理解为一个名为yY实例被分配给类型为Xx1。在分配过程中,从类型YX发生了隐式(隐藏)向上转换。 - Kevin Bowersox

0

Y extends X 的意思是使用 new Y() 创建的对象将是类型为 Y,因此也是类型为 X。因为 Y 是从 X 派生出来的超类,任何类型为 Y 的对象也是类型为 X 的。

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


0
这是向上转型,因为你有一个类型为Y的实例,它被一个类型为X的变量引用,并且X在类层次结构中处于“上方”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接