共计 903 个字符,预计需要花费 3 分钟才能阅读完成。
在 Java 中强制类型转换分为根本数据类型和援用数据类型两种,这里咱们探讨的后者,也就是援用数据类型的强制类型转换。
在 Java 中因为继承和向上转型,子类能够十分天然地转换成父类,然而父类转换成子类则须要强制转换。因为子类领有比父类更多的属性、更强的性能,所以父类转换为子类须要强制。那么,是不是只有是父类转换为子类就会胜利呢?其实不然,他们之间的强制类型转换是有条件的。
当咱们用一个类型的结构器结构出一个对象时,这个对象的类型就曾经确定的,也就说它的实质是不会再发生变化了。在 Java 中咱们能够通过继承、向上转型的关系应用父类类型来援用它,这个时候咱们是应用性能较弱的类型援用性能较强的对象,这是可行的。然而将性能较弱的类型强制转性能较强的对象时,就不肯定能够行了。
举个例子来阐明。比方零碎中存在 Father、Son 两个对象。首先咱们先结构一个 Son 对象,而后用一个 Father 类型变量援用它:
Father father = new Son();
在这里 Son 对象实例被向上转型为 father 了,然而请留神这个 Son 对象实例在内存中的实质还是 Son 类型的,只不过它的能力长期被消弱了而已,如果咱们想变强怎么办?将其对象类型还原!
Son son = (Son)father;
这条语句是可行的,其实 father 援用依然是 Father 类型的,只不过是将它的能力增强了,将其增强后转交给 son 援用了,Son 对象实例在 son 的变量的援用下,复原真身,能够应用全副性能了。
后面提到父类强制转换成子类并不是总是胜利,那么在什么状况下它会生效呢?
当援用类型的实在身份是父类自身的类型时,强制类型转换就会产生谬误。例如:
Father father = new Father();
Son son = (Son) father;
这个零碎会抛出 ClassCastException 异样信息。
所以编译器在编译时只会查看类型之间是否存在继承关系,有则通过;而在运行时就会查看它的实在类型,是则通过,否则抛出 ClassCastException 异样。
所以在继承中,子类能够主动转型为父类,然而父类强制转换为子类时只有当援用类型真正的身份为子类时才会强制转换胜利,否则失败