若是你以前一直没有怎么仔细了解过instanceof
关键字,如今就来了解一下:html
instanceof
实际上是java的一个二元操做符,和=
,<
,>
这些是相似的,同时它也是被保留的关键字,主要的做用,是为了测试左边的对象,是否是右边的类的实例,返回的是boolean值。java
A instanceof B
注意:A
是实例,而B
则是Class类
数组
下面使用代码测试一下:sass
class A{ } interface InterfaceA{ } class B extends A implements InterfaceA{ } public class Test { public static void main(String[] args) { B b = new B(); System.out.println(b instanceof B); System.out.println(b instanceof A); System.out.println(b instanceof InterfaceA); A a = new A(); System.out.println(a instanceof InterfaceA); } }
输出结果以下:安全
true true true false
从上面的结果,其实咱们能够看出instanceof
,至关于判断当前对象能不能装换成为该类型,java
里面上转型是安全的,子类对象能够转换成为父类对象,接口实现类对象能够装换成为接口对象。oracle
对象a
和Interface
没有什么关系,因此返回false
。jvm
那若是咱们装换成为Object了,它还能认出来是哪个类的对象么?学习
public class Test { public static void main(String[] args) { Object o = new ArrayList<Integer>(); System.out.println(o instanceof ArrayList); String str = "hello world"; System.out.println(str instanceof String); System.out.println(str instanceof Object); } }
上面的结果返回都是true
,也就是认出来仍是哪个类的对象。同时咱们使用String
对象测试的时候,发现对象既是String
的实例,也是Object
的实例,也印证了Java
里面全部类型都默认继承了Obejct
。测试
可是值得注意的是,咱们只能使用对象来instanceof
,不能使用基本数据类型,不然会报错。code
若是对象为null
,那是什么类型?
这个答案是:不知道什么类型,由于null
能够转换成为任何类型,因此不属于任何类型,instanceof
结果会是false
。
具体的实现策略咱们能够在官网找到:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.instanceof
若是S
是objectref
所引用的对象的类,而T
是已解析类,数组或接口的类型,则instanceof
肯定是否 objectref
是T
的一个实例。S s = new A(); s instanceof T
若是S是一个普通的(非数组)类,则:
若是S是接口类型,则:
若是S是表示数组类型SC的类[],即类型SC的组件数组,则:
可是具体的底层原理我在知乎找到的R大 回答的相关问题,https://www.zhihu.com/question/21574535,看完以为我太弱了...我是菜鸟...我确实是菜鸟
其实这个和上面那个是基本相同的,主要是这个调用者是Class
对象,判断参数里面的对象是否是这个Class
对象的实例。
class A { } interface InterfaceA { } class B extends A implements InterfaceA { } public class Test { public static void main(String[] args) { B b = new B(); System.out.println(B.class.isInstance(b)); System.out.println(A.class.isInstance(b)); System.out.println(InterfaceA.class.isInstance(b)); A a = new A(); System.out.println(InterfaceA.class.isInstance(a)); } }
历史老是惊人的类似!!!
true true true false
事实证实,这个isInstance(o)
判断的是o
是否属于当前Class
类的实例.
不信?再来测试一下:
public class Test { public static void main(String[] args) { String s = "hello"; System.out.println(String.class.isInstance(s)); // true System.out.println(Object.class.isInstance(s)); // true System.out.println("============================="); Object o = new ArrayList<String>(); System.out.println(String.class.isInstance(o)); // false System.out.println(ArrayList.class.isInstance(o)); // true System.out.println(Object.class.isInstance(o)); // true } }
能够看出,其实就是装换成为Object
,以前的类型信息仍是会保留着,结果和instance
同样,区别是:
instanceof
:前面是实例对象,后面是类型isInstance
:调用者(前面)是类型对象,参数(后面)是实例对象可是有一个区别哦😯,isInstance()
这个方法,是可使用在基本类型上的,其实也不算是用在基本类型,而是自动作了装箱操做。看下面👇:
System.out.println(Integer.class.isInstance(1));
参数里面的1,其实会被装箱成为new Integer(1)
,因此这样用不会报错。
instanceof
判断对象和类型之间的关系,是关键字,只能用于对象实例,判断左边的对象是否是右边的类(包括父类)或者接口(包括父类)的实例化。isInstance(Object o)
:判断对象和类型之间的关系,判断o
是否是调用这个方法的class
(包括父类)或者接口(包括父类)的实例化。isAssignableFrom
:判断的是类和类之间的关系,调用者是否能够由参数中的Class
对象转换而来。注意:java
里面一切皆是对象,因此,class
自己也是对象。
【做者简介】:
秦怀,公众号【秦怀杂货店】做者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界但愿一切都很快,更快,可是我但愿本身能走好每一步,写好每一篇文章,期待和大家一块儿交流。
此文章仅表明本身(本菜鸟)学习积累记录,或者学习笔记,若有侵权,请联系做者核实删除。人无完人,文章也同样,文笔稚嫩,在下不才,勿喷,若是有错误之处,还望指出,感激涕零~