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,不再运算右操作数是什么类。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值