您的位置:首页 > 编程语言 > Java开发

java基础_instanceof运算符的总结

2014-04-09 22:12 190 查看

instanceof运算符总结

instanceof运算符的前一个操作数通常是一个引用类型的变量,后一个操作数通常是一个类(也可以是一个接口),他用于判断前面的对象是否是后面的类或其子类,实现类的实例。但是java中使用instanceof有一个限制:instanceof运算符前面操作数的编译时类型必须是如下三种情况:

1,与后面的类相同。

2,是后面类的父类。

3,是后面类的子类。

一旦instanceof在=运算符通过了编译,程序进入运行阶段,如果塔实际引用的对象是第二个操作数的实例,或者是第二个操作数的子类,实现类的实例。那么instanceof运算的结果返回true.

再来看一下下面这个代码:class InstanceofTest

{

public static void main(String[] args)

{

Object str ="java";

//执行强制类型转换

//让math引用原来str引用对象

Math math = (Math)str; // 1

System.out.println("字符串是否是String的实例:"+(math instance String)); // 2

}

}

这个程序编译不能通过。

粗看之下,math实际引用的就是String对象,程序用stanceof判断他的类型应该输出true,没错。。如果程序可以通过编译,2行带密码确实输出true。

问题是,当编译器编译java程序时,编译器无法检查引用变量实际引用对象的类型,它值检查该变量的编译时类型对于2行代码而言,math的编译时类型是math,math既不是String类型,也不是String类型的父类,或子类,因此程序无法通过编译,

至于1行代码为什么没有出现编译错误,这和强制转型的机制有关,对于java的强制转型而言也可以分为编译,运行两个阶段来分析它。

在编译阶段,强制转型要求被转型变量的编译时类型必须是以下3中情况,

1,被转型变量的编译时类型与目标类型相同,

2,被转型变量的编译时类型是目标类型父类。

3,被转型变量的编译时类型是目标类型的子类,在这种情况下可以自动向上转型,无需强制转换,

如果被转型变量的编译时类型与目标类型没有任何继承关系,编译器将提示编译错误,

在运行阶段,不转型变量所引用对象的实际类型必须是目标类型的实例,或者是目标类型的子类,实现类的实例,否则在运行时会引发ClassCastException异常。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: