java中instanceof 详解,神奇的instanceof
本文地址:http://www.dutycode.com/instanceof_shiyong_jiqiao.html
除非注明,文章均为 www.dutycode.com 原创,欢迎转载!转载请注明本文地址,谢谢。
instanceof是java里面的一个二元操作符,主要来判断一个对象是否是一个类的实例。
但是,真的会用吗?
看下面的代码,看看你能答对几个?
package com.dutycode.blog.example.instanceexpamle;
import java.util.Date;
/**
* instanceof的使用
* @author dutycode@gmail.com
* @site www.dutycode.com
*/
public class InstanceOfExample {
public static void main(String[] args) {
//String对象是否属于Object实例?
System.out.println( "String" instanceof Object);
//String对象是否属于String实例?
System.out.println(new String() instanceof String);
//Object对象是否属于String实例?
System.out.println(new Object() instanceof String);
//拆箱类型是否是装箱类型的实例?
System.out.println('A' instanceof Character);
//null是否是String的实例
System.out.println(null instanceof String);
//类型转换后的null是否是String的实例
System.out.println((String) null instanceof String);
//判断date对象是否是String的实例
System.out.println(new Date() instanceof String);
//在范型中判断string是否是Date的实例
System.out.println(new DemoClass().isDateInstance("string"));
}
}
class DemoClass{
public boolean isDateInstance(T t){
return t instanceof Date;
}
}
解析:
1、true
"String"instanceof Object 这个肯定是true, String类型的对象是继承自Object的,所以这个是true
2、true
new String() instanceof String ,一个类的对象,自然是这个类的实例
3、false
new Object() instanceof String , object是所有类的父类,所以肯定不是String的实例了。
4、编译不通过
'A' instanceof Character ,为啥呢?char类型不是Character的实例吗?为啥不行? 这里涉及到一个instanceof的原则:instanceof只能用于对象的判断,不能用于基本类型的判断。 这里’A’ 是个char类型的,char是个基本数据类型,所以无法使用instanceof判断,也就会编译不通过了。
5、false
null instanceof String , null是没有类型的, instanceof有个特有的原则:如果左值是null类型,则就直接返回false,这样做也是很有好处的,这样我们再判断的时候,不需要判断对象是否为null值了。
6、false
(String) null instanceof String, 可能这个会有疑问,既然我都强转成String类型了,为什么还是false呢?原因在于,null是个万能类型,即上面说的是没有类型的。所以,即使你再前面加上了String的强转,他依旧是null类型,这样就符合了上面的那个原则:如果左值是Null,则直接返回false
7、编译不通过
new Date() instanceof String, 是不是有个大大的问号?instanceof的使用中,有这么个原则:instance操作符左值和右值(或者称作 左右操作数)必须有继承关系或者实现关系,否则会编译不通过。此案例中,Date和String没有任何继承或者实现关系。所以,自然就编译不通过了。
8、false
new DemoClass().isDateInstance("string”) , 有了上面的那个案例,你可能会觉得这个应该是编译不通过的啊,毕竟String和Date之间没有继承和实现关系。 但是!java的泛型是为编码服务的,主要目的是帮助程序猿发现类型的不匹配,在编译器编译成字节码之后,T已经是Object类型了。所以isDateInstance方法的内容实际上就是Object instanceof String, 那么自然也就是false了。
总结:
instanceof的几个原则:
1、instanceof只能用于对象的判断,不能用于基本数据类型的判断。
2、instanceof的左右两个操作数,必须有继承或者实现关系,否则不能变已通过。
3、instanceof的左操作数如果是null,则直接返回false,不再运算右操作数是什么类。
java中instanceof 详解,神奇的instanceof相关推荐
- Java中CAS详解
转载自 Java中CAS详解 在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁 锁机制存在以下问题: (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换 ...
- Java中LinkedList详解
Java中LinkedList详解 LinkedList底层是双向链表 单向链表 双向链表 LinkedList新增的方法 主要增加了针对头结点与尾结点进行操作的方法, 即针对第一个元素和最后一个元素 ...
- Java中super详解
目录 Java中super详解 super的作用: 1. 通过super可以访问父类的构造方法 2. 通过super可以访问父类的属性(非私有) 3. 通过super可以访问 ...
- java中匿名内部类详解_java 中匿名内部类的实例详解
搜索热词 java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈&q ...
- java中priorityqueue_详解JAVA中priorityqueue的具体使用
Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示.本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度, ...
- java中implement_详解JAVA中implement和extends的区别
详解JAVA中implement和extends的区别 extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,Java中不支持多重继承,但是可以用接口来实 ...
- java中final详解_Java中final用法与详解
Java中final用法与详解 final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的.这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. f ...
- java中getclass_详解java中this.getClass()和super.getClass()的实例
详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...
- java中File详解
#第六部分:IO流 ##1. File类的作用 File类是Java.io包中唯一代表磁盘我呢见本身的对象.File类定义类一些与平台无关的方法 来操作文件,File类主要用来获取或处理与磁盘文件相关 ...
最新文章
- python3x 线程threading的使用
- 创建Silverlight自定义启动画面
- R语言数据描述性统计(Descriptive statistics)实战:数据全局描述信息、数值数据的描述性统计(Numerical data)、离散型数据的描述性统计(Categorical)
- Li‘s 影像组学视频学习笔记(10)-T检验+lasso+随机森林、Li‘s have a solution and plan.
- [ Luogu 4626 ] 一道水题 II
- 读债务危机0812:接管房利美和房地美
- Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
- Boost.MultiIndex 使用重排工具的例子
- 安卓三维展示源码_手机(安卓)自动化脚本开发线上培训
- 这是霄哥的天气预报,屌不屌?
- oracle查询 :一个角色包括的系统权限,对象权限,Oracle有多少种角色,某个用户有什么角色
- 个人用户升级鸿蒙,老用户等到了!鸿蒙升级标准确定,“三岁”以下机型全更新...
- tomcat配置及其中部分目录作用虚拟路径虚拟主机
- Uinttest +excel结合使用--详细讲解
- [算法]bitmap算法
- 13-微信小程序商城 产品简介布局(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
- 蓝牙厂商代码与公司对应列表
- mysql PTA题解查询平均成绩最高的前三名同学
- 一个完整的软件开发过程到底需要哪些步骤?
- 参考文献中英文人名_参考文献中英文人名的写法