【Java 基础】-- isAssignableFrom 的用法详细解析
[TOC]
最近在java的源代码中总是可以看到isAssignableFrom()
这个方法,到底是干嘛的?怎么用?
1. isAssignableFrom()是干什么用的?
首先我们必须知道的是,java里面一切皆对象,类本身也是会当成对象来处理,主要体现在类的.class
文件,其实加载到java虚拟机之后,也是一个对象,它就是Class
对象,全限定类名:java.lang.Class
。
那这个isAssignableFrom()
其实就是Class对象的一个方法:
用native
关键字描述,说明是一个底层方法,实际上是使用c/c++实现的,java里面没有实现,那么这个方法是干什么的呢?我们从上面的注释可以解读:
如果是A.isAssignableFrom(B)
确定一个类(B)是不是继承来自于另一个父类(A),一个接口(A)是不是实现了另外一个接口(B),或者两个类相同。主要,这里比较的维度不是实例对象,而是类本身,因为这个方法本身就是Class
类的方法,判断的肯定是和类信息相关的。
也就是判断当前的Class对象所表示的类,是不是参数中传递的Class对象所表示的类的父类,超接口,或者是相同的类型。是则返回true,否则返回false。
2.代码实验测试
2.1 父子继承关系测试
运行结果如下:
从运行结果来看,C
继承于B
,B
继承于A
,那么任何一个类都可以isAssignableFrom
其本身,这个从中文意思来理解就是可以从哪一个装换而来,自身装换而来肯定是没有问题的,父类可以由子类装换而来也是没有问题的,所以A可以由B装换而来,同时也可以由子类的子类转换而来。
上面的代码也说明一点,所有的类,其最顶级的父类也是Object
,也就是所有的类型都可以转换成为Object
。
2.2 接口的实现关系测试
输出结果如下:
从上面的结果看,其实接口的实现关系和类的实现关系是一样的,没有什么区别,但是如果B
和C
都实现了同一个接口,他们之间其实是不能互转的。
如果B
实现了接口A
,D
继承了B
,实际上D
是可以上转为A接口的,相当于D
间接实现了A
,这里也说明了一点,其实继承关系和接口实现关系,在isAssignableFrom()
的时候是一样的,一视同仁的。
3.总结
isAssignableFrom
是用来判断子类和父类的关系的,或者接口的实现类和接口的关系的,默认所有的类的终极父类都是Object
。如果A.isAssignableFrom(B)
结果是true,证明B
可以转换成为A
,也就是A
可以由B
转换而来。
这个方法在我们平时使用的不多,但是很多源码里面判断两个类之间的关系的时候,(注意:是两个类的关系,不是两个类的实例对象的关系!!!),会使用到这个方法来判断,大概因为框架代码或者底层代码都是经过多层抽象,做到容易拓展和解耦合,只能如此。
【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。
此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
版权声明: 本文为 InfoQ 作者【秦怀杂货店】的原创文章。
原文链接:【http://xie.infoq.cn/article/7f69ed45b7586971cee70ac18】。文章转载请联系作者。
评论