关于 Java 的强制类型转换

来源:互联网 发布:淘宝韩妆店铺名字大全 编辑:程序博客网 时间:2024/05/17 09:38

java的强制类型转换

强制类型转换,又叫造型。分为基本数据类型和引用数据类型两种情况,这里探讨后者,即引用类型的强制类型转换。

对于引用类型来说,什么是强制类型转换呢?简单地说,就是把父类型转换为子类型。因为子类型比父类型的内涵要丰富,无非就是属性更多功能更强,所以要把父类型转换为子类型,需要强制,所以叫强制类型转换。那么,是不是只要是父类型的变量就可以转换为子类型呢?事实上不是,这里是有条件限制的。

首先来看发生在什么情况下。我们用一个类型的构造方法构造出一个对象的时候,对象的类型已经确定了,就是这个类型,但是java允许我们可以不用这个类型的变量引用它,而使用它的父类类型,这时候情况就是我们用一个功能较弱的类型引用了一个功能较强的对象。然而有时候我们又希望这个对象完全发挥它的作用,就需要用一个它本身的类型的变量来引用它,因为原来那个父类的变量是不具备这些功能的,不能使用variablename.function()来使其发挥作用,所以还是用它自己的吧。问题是对象已经在内存中了,已经构造完了,你即使声明一个它本身类型的变量怎么指向它呢?答案是借助原来那个变量,就是它父类型的那个变量,让新的变量和原来的那个指向同一个对象。方式就是两者之间划等号。可是引用类型变量的相等需要两者类型相同,问题是不相同,怎么办?那就是把父类型的变量强制转换成子类型。

举个例子来说,比如原来定义了两个类型,FatherClass和SonClass,然后构造了一个SonClass类型的对象,用一个FatherClass类型的变量father引用了,就像这样:

FatherClass father = new SonClass();

那么,需要将这个对象的类型还原的时候,就可以用这个表达式。

SonClass son = (SonClass)father;

其实,father仍然是FatherClass类型,只不过临时把它的能力提升了一下,然后这一切都交给了son这个变量。但是经过这样处理以后,这个对象就真正提升了能力了,在son这个变量的引用之下,从此以后恢复真身,可以自由发挥了。

我们刚才说从父类到子类的强制类型转换并不总是能够成功,那什么时候不能成功呢?

在于这个的对象的真实类型,也就是它是使用什么类的构造方法构造出来的。如果它本身就是父类的类型,那么强制类型转换是不会成功的。

还是举个例子:

FatherClass f = new FatherClass();

SonClass s = (SonClass)f; //这时候就会报错,运行时报错,编译能通过的

编译器只检查类型之间有无继承关系,有则通过;运行时检查真正类型,是则通过。

Java 的强制类型转换可以向上转换(子类转换为父类),也可以向下转换(父类转换为子类)

当向上强制转换的时候,子类独有的方法和属性会隐藏。但是还是存在的,例如
A a = new B();
B b = (B) a; //强制转换
这时仍能使用而调用b的fun3();

一个常用的例子是当我们需要的返回值类型是子类的时候,就需要把父类强制转换为子类返回

0 0