在Java中,重复进行向下转换和向上转换是否会擦除子类中的数据?

时间:2018-12-09 02:54:28

标签: java downcast upcasting

我意识到向上转换将子类转换为超类,而向下转换则以相反的方式进行。但是,假设子类和超类的数据类型数目不同,从子类->超类->子类进行的转换是否会擦除一部分数据,因为子类内部的某些数据不包括在超类中?

因为我知道在c ++中将浮点类型的数据转换为int时会删除浮点数,所以我想知道它对于Java类的工作方式是否相同。

1 个答案:

答案 0 :(得分:4)

在Java中,对象类型是引用类型,这意味着表达式从不实际对对象求值,仅对对象的引用求值。

因此,向上投射和向下投射实际上根本没有碰到对象。它们只是为您提供对象 不同类型的引用。

即此Java代码:

(Subclass)((Superclass) instanceOfSubclass)

大致类似于以下C ++代码:

dynamic_cast<subclass &>(static_cast<superclass &>(instance_of_subclass))

但是,如果使用intfloat之类的值类型进行转换,则确实可能会丢失数据。此Java代码:

(double)((int) 3.5)

求值为3而不是3.5,因为对类型int的转换会丢弃该值的小数部分。类似于此C ++代码:

static_cast<double>(static_cast<int>(3.5))