在进行强制类型转换的时候为了防止出现ClassCastException,需要进行判断,可以使用instanceof操作符。下面分别介绍instanceof操作符的基本用法、使用的场合以及注意事项。
1、基本用法
instanceof操作符用于判断某个对象是否是某个类型的对象。
格式如下:
o instanceof C
o表示对象,C表示类型,如果o是C的对象表达式返回true,否则返回false。
下面的代码用于判断参数是否为整数:
public void f(Object o){
if(o instanceof Integer){
System.out.println("参数是整数!");
}
}
2、使用场合
在对一个对象进行强制类型转换的时候,如果类型不匹配,就会产生java.lang.ClassCastException异常。例如下面的代码:
Animal a = new Cat();
Dog d = (Dog)a;
上面的代码从语法上看没有问题,但是逻辑上是要把猫强制转换成狗,我们知道它不能转换,事实上也不能转换,程序能够编译通过,但是运行的时候就会报错:java.lang.ClassCastException.
这个问题很容易发现,有时候却不怎么容易发现,例如下面的代码:
public void f(Animal a){
Dog d = (Dog)a;
...
}
参数的类型是Animal,能不能强制转换成Dog呢?不一定,所以为了避免因为a不是Dog而转换出错,就需要使用instanceof进行判断了。上面的代码可以改成下面的样子:
public void f(Animal a){
if(a instanceof Dog){
Dog d = (Dog)a;
...
}
}
这样就可以避免ClassCastException异常了。
3、使用时候的注意事项
a)在使用的时候,instanceof前面的类型是已知的(例如上面的例子中a的类型是Animal),instanceof后面的类型应该与声明变量使用的类型有关系,通常应该是子类。例如下面的代码:
Number x = 0;
System.out.println(x instanceof Integer); // 正确
System.out.println(x instanceof Number);// 正确
System.out.println(x instanceof Object);// 正确
System.out.println(x instanceof String); // 错误
第1行声明了x的类型是Number。第2行判断x是不是Integer类型,是合法的,因为Integer是Number的子类。第3行是合法的,就是Number类型本身。第3行也是合法的,因为Object是Number的祖先类。第5行是错误的,因为String类与Number类没有任何关系。实际上第3行和第4行的结果肯定是true。有意义的是第2行。
b)在进行判断的时候指的是实例而不是引用,例如下面的代码将输出false。
String tt=null;
System.out.println(tt instanceof String);
使用String定义了引用tt,但是没有指向任何实例,所以要判断它是不是String的实例,返回值就是false,因为他不是实例。
李绪成 优快云 Blog:http://blog.youkuaiyun.com/javaeeteacher
优快云学生大本营:http://student.youkuaiyun.com/space.php?uid=124362
如果喜欢我的文章,就加我为好友:http://student.youkuaiyun.com/invite.php?u=124362&c=7be8ba2b6f3b6cc5