Java能投出什么吗?

时间:2014-05-16 19:57:27

标签: java object casting subclass

我在学校学习了一年的java课程,对铸造的理解非常有限。

我理解的转换类型是将int转换为double。这是有道理的; 1将成为1.0

我不太了解的铸造类型是: 将自定义对象(比如superRectangle)转换为另一个客户对象(例如myRectangle)。 (假设myRectanglesuperRectangle的子类) 与superRectangle实例关联的所有私有或公共字段会发生什么?该计划如何知道这是一个合法的举动?对于所有重要的事情,我只能将一个int转换成一个字符串,那究竟是什么意思呢?

3 个答案:

答案 0 :(得分:6)

严格来说,从intdouble不是投射,而是转化。转换是关于将内存中相同的,未更改的位模式重新解释为属于另一种类型。这正是Java中的转换引用类型归结为:你有一个明确的,不可更改类型的对象,而你只是看起来就好像它是一个超类型的实例。

您将不被允许将Integer投射到String,因为后者不是前者的超类型。这在编译时得到了保证,并且在运行时也进行了双重检查。

答案 1 :(得分:2)

类层次结构,如果它们位于同一层次结构中,那么在编译时不会出现转换问题。

IntegerDouble兄弟姐妹,而不是在同一层次结构中,因此您可以'说

Double d = (Double)(new Integer(4));// compile time error

每个子类也都知道它的超类。

详细了解OOP: Class Hierarchy

答案 2 :(得分:1)

只有当" superRectangle"是一个" myRectangle"刚刚被引用为superRectangle。如果不是,您将在运行时获得转换异常。

如果我们假设MyRectangleYourRectangle都延伸SuperRectangle ...

此代码可以使用:

SuperRectangle superRect = new MyRectangle();
MyRectangle castedMyRect = (MyRectangle)superRect;

此代码将抛出ClassCastException

SuperRectangle superRect = new MyRectangle();
YourRectangle castedYourRect = (YourRectangle)superRect;