神奇的instanceof

losetowin 发布于:2015-11-15 22:15 分类:Java  有 5997 人浏览,获得评论 5 条 标签: java 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<String>().isDateInstance("string"));
		
		
	}

}

class DemoClass<T>{
	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<String>().isDateInstance("string) , 有了上面的那个案例,你可能会觉得这个应该是编译不通过的啊,毕竟String和Date之间没有继承和实现关系。 但是!java的泛型是为编码服务的,主要目的是帮助程序猿发现类型的不匹配,在编译器编译成字节码之后,T已经是Object类型了。所以isDateInstance方法的内容实际上就是Object instanceof String, 那么自然也就是false了。


总结:
     instanceof的几个原则:
          1、instanceof只能用于对象的判断,不能用于基本数据类型的判断。
          2、instanceof的左右两个操作数,必须有继承或者实现关系,否则不能变已通过。
          3、instanceof的左操作数如果是null,则直接返回false,不再运算右操作数是什么类。

版权所有:《攀爬蜗牛》 => 《神奇的instanceof
本文地址:https://www.dutycode.com/instanceof_shiyong_jiqiao.html
除非注明,文章均为 《攀爬蜗牛》 原创,欢迎转载!转载请注明本文地址,谢谢。