博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java_instanceof运算符的总结
阅读量:6004 次
发布时间:2019-06-20

本文共 1077 字,大约阅读时间需要 3 分钟。

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异常。

转载于:https://www.cnblogs.com/grkbeyond/p/4147270.html

你可能感兴趣的文章
诊断一句SQL不走索引的原因
查看>>
iOS开发拓展篇—UIDynamic(简单介绍)
查看>>
Linux pipe函数
查看>>
图片标注工具LabelImg使用教程
查看>>
(原創) 如何設計一個數位相框? (SOC) (Quartus II) (SOPC Builder) (Nios II) (TRDB-LTM) (DE2-70)...
查看>>
/etc/profile文件内容
查看>>
量词 匹配优先与忽略优先
查看>>
一页纸IT项目管理:大道至简的实用管理沟通工具
查看>>
汽车知识:车内异味的清除方法
查看>>
IE6 7下绝对定位引发浮动元素神秘消失
查看>>
android - ADT本地配置、sdk配置
查看>>
I.MX6 dhcpcd 需要指定网卡
查看>>
js递归原理之return
查看>>
浏览器的回流和重绘及其优化方式
查看>>
centos配置ssh免密码登录后,仍提示输入密码
查看>>
gulp+browser-sync实现前端自动化刷新
查看>>
python学习笔记 --- 来看看 random_state 这个参数
查看>>
基于angular2实现用户登录并信息持久化的一些理解(三)
查看>>
新框架 - 收藏集 - 掘金
查看>>
JQuery坑,说说哪些大家都踩过的坑
查看>>