我意识到向上转换将子类转换为超类,而向下转换则以相反的方式进行。但是,假设子类和超类的数据类型数目不同,从子类->超类->子类进行的转换是否会擦除一部分数据,因为子类内部的某些数据不包括在超类中?
因为我知道在c ++中将浮点类型的数据转换为int时会删除浮点数,所以我想知道它对于Java类的工作方式是否相同。
答案 0 :(得分:4)
在Java中,对象类型是引用类型,这意味着表达式从不实际对对象求值,仅对对象的引用求值。
因此,向上投射和向下投射实际上根本没有碰到对象。它们只是为您提供对象 不同类型的引用。
即此Java代码:
(Subclass)((Superclass) instanceOfSubclass)
大致类似于以下C ++代码:
dynamic_cast<subclass &>(static_cast<superclass &>(instance_of_subclass))
但是,如果使用int
和float
之类的值类型进行转换,则确实可能会丢失数据。此Java代码:
(double)((int) 3.5)
求值为3
而不是3.5
,因为对类型int
的转换会丢弃该值的小数部分。类似于此C ++代码:
static_cast<double>(static_cast<int>(3.5))