我意识到向上转换将子类转换为超类,而向下转换则相反。然而,假设子类和超类有不同数量的数据类型,从子类->超类->子类的转换是否会导致部分数据擦除,因为子类中的某些数据部分不包括在超类中?
因为我知道当浮点类型的数据在c++中转换为int时,浮点会被擦除,所以我想知道它在java中是否以同样的方式工作。
在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))