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异常。 |
相关文章推荐
- Java的基础语法总结 (运算符、控制流程、函数和数组)
- java基础技术知识点总结——运算符
- 黑马程序员----java基础--常量变量运算符总结
- Java基础-03.总结运算符、键盘录入、if语句
- 黑马程序员——Java基础---变量、运算符、语句总结
- 黑马程序员----java基础运算符选择结构总结
- 总结一下java的那些基础运算符
- Java基础学习总结----数据类型和运算符
- 黑马程序员---Java基础总结---数据结构、运算符
- JAVA_SE ----- 基础知识总结-----运算符,键盘录入,语句
- Java基础总结(一)数据类型和运算符
- Java基础回顾_instanceof运算符_属于
- java基础学习总结三(jdk7新特性、变量(局部变量和成员变量)、常量以及运算符)
- java基础复习总结之运算符
- java_instanceof运算符的总结
- 2.25 Java基础总结 ①多态②向上向下转型③instanceof
- 黑马程序员——java第二天:基础语法(总结:运算符)
- Java基础知识概括总结三 运算符
- Java基础-03.总结运算符、键盘录入、if语句
- Java基础语法<一> 数据类型&运算符