将一个类型强制转换成另一个类型的过程被称为强制类型转换。Java 程序设计语言提供了一种专门用于进行强制类型转换的表示法。
double x = 3.405;
int nx = (int) x;
将表达式 x 的值转换成整数类型,舍弃了小数部分。java
正像有时候须要将浮点数转换成整数同样,有时候也可能须要将某个类的对象引用转换成另一个类的对象引用。要完成对象引用的强制类型转换,转换语法与数值表达式的强制类型转换相似,仅须要用一对圆括号将目标类名括起来,并放置在须要转换的对象引用以前就能够了。数组
public class Manager extends Employee { ... }
Employee[] staff = new Employee[3]; staff[0] = new Manager("Carl Cracker", 75000, 1987, 12, 15); staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // 强制类型转换 Manager boss = (Manager)staff[0];
进行强制类型转换的惟一缘由是: 要在暂时忽视对象的实际类型以后使用对象的所有功能。例如,因为某些元素是普通员工,因此 staff 数组必须是 Employee 对象的数组。咱们须要将数组中引用经理的元素复原成 Manage 对象,以便可以访问新增长的全部变量。ide
在 Java中,每一个对象变量都有一个类型。类型描述了这个变量所引用的以及可以引用的对象类型。例如,staff[i] 引用了一个 Employee 对象(所以它还能够引用 Manager 对象)。测试
将一个值存入变量时,编译器将检查你是否承诺过多。若是将一个子类的引用赋给一个超类变量,编译器是容许的。但将一个超类的引用赋给一个子类变量时,就承诺过多了。必须进行强制类型转换,这样才可以经过运行时的检査。设计
若是试图在继承链上进行向下的强制类型转换,而且 “谎报” 对象包含的内容,会发生什么状况呢?
Manager boss = (Manager) staff[1] ; // Error
运行这个程序时,Java 运行时系统将注意到你的承诺不符,并产生一个 ClassCastException 异常。若是没有捕获这个异常,那么程序就会终止。所以,应该养成这样一个良好的程序设计习惯:在进行类型转换以前,先查看是否可以成功地转换。为此只须要使用 instanceof 操做符就能够实现。例如:code
if(staff[1] instanceof Manager) { boss = (Manager) staff[1]; ... }
最后,若是这个类型转换不可能成功,编译器就不会让你完成这个转换。例如,下面这个强制类型转换:
String c = (String) staff[1];
将会产生编译错误,这是由于 String 不是 Employee 的子类。 对象
强制类型转换注意事项:继承
若是 x 为 null,进行如下测试
x instanceof C
不会产生异常,只是返回 false。之因此这样处理是由于 null 没有引用任何对象,固然也不会引用 C 类型的对象。get
实际上,经过强制类型转换来转换对象的类型一般并非一种好的作法。在咱们的示例中,大多数状况并不须要将 Employee 对象强制转换成 Manager 对象,两个类的对象都可以正确地调用 getSalary 方法,这是由于实现多态性的动态绑定机制可以自动地找到正确的方法。编译器
只有在使用 Manager 中特有的方法时才须要进行类型转换。若是出于某种缘由发现须要在 Employee 对象上调用 Manager 中特有的 setBonus 方法,那么就应该自问超类的设计是否合理。可能须要从新设计超类,并添加 setBonus 方法,这才是更合适的选择。请记住,只要没有捕获 ClassCastException 异常,程序就会终止执行。 通常状况下,最好尽可能少用强制类型转换和 instanceof 运算符。