【Java基础】-- isAssignableFrom的用法详细解析

[TOC]
最近在java的源代码中老是能够看到isAssignableFrom()这个方法,究竟是干吗的?怎么用?java

1. isAssignableFrom()是干什么用的?

首先咱们必须知道的是,java里面一切皆对象,类自己也是会当成对象来处理,主要体如今类的.class文件,其实加载到java虚拟机以后,也是一个对象,它就是Class对象,全限定类名:java.lang.Classc++

那这个isAssignableFrom()其实就是Class对象的一个方法:框架

/**
     * Determines if the class or interface represented by this
     * {@code Class} object is either the same as, or is a superclass or
     * superinterface of, the class or interface represented by the specified
     * {@code Class} parameter. It returns {@code true} if so;
     * otherwise it returns {@code false}. If this {@code Class}
     * object represents a primitive type, this method returns
     * {@code true} if the specified {@code Class} parameter is
     * exactly this {@code Class} object; otherwise it returns
     * {@code false}.
     *
     * <p> Specifically, this method tests whether the type represented by the
     * specified {@code Class} parameter can be converted to the type
     * represented by this {@code Class} object via an identity conversion
     * or via a widening reference conversion. See <em>The Java Language
     * Specification</em>, sections 5.1.1 and 5.1.4 , for details.
     *
     * @param cls the {@code Class} object to be checked
     * @return the {@code boolean} value indicating whether objects of the
     * type {@code cls} can be assigned to objects of this class
     * @exception NullPointerException if the specified Class parameter is
     *            null.
     * @since JDK1.1
     */
    public native boolean isAssignableFrom(Class<?> cls);

native关键字描述,说明是一个底层方法,其实是使用c/c++实现的,java里面没有实现,那么这个方法是干什么的呢?咱们从上面的注释能够解读:ide

若是是A.isAssignableFrom(B)
肯定一个类(B)是否是继承来自于另外一个父类(A),一个接口(A)是否是实现了另一个接口(B),或者两个类相同。主要,这里比较的维度不是实例对象,而是类自己,由于这个方法自己就是Class类的方法,判断的确定是和类信息相关的。学习

也就是判断当前的Class对象所表示的类,是否是参数中传递的Class对象所表示的类的父类,超接口,或者是相同的类型。是则返回true,不然返回false。测试

2.代码实验测试

2.1 父子继承关系测试

class A{
}
class B extends A{
}
class C extends B{
}
public class test {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        B b1 = new B();
        C c = new C();
        System.out.println(a.getClass().isAssignableFrom(a.getClass()));
        System.out.println(a.getClass().isAssignableFrom(b.getClass()));
        System.out.println(a.getClass().isAssignableFrom(c.getClass()));
        System.out.println(b1.getClass().isAssignableFrom(b.getClass()));

        System.out.println(b.getClass().isAssignableFrom(c.getClass()));

        System.out.println("=====================================");
        System.out.println(A.class.isAssignableFrom(a.getClass()));
        System.out.println(A.class.isAssignableFrom(b.getClass()));
        System.out.println(A.class.isAssignableFrom(c.getClass()));

        System.out.println("=====================================");
        System.out.println(Object.class.isAssignableFrom(a.getClass()));
        System.out.println(Object.class.isAssignableFrom(String.class));
        System.out.println(String.class.isAssignableFrom(Object.class));
    }
}

运行结果以下:this

true
true
true
true
true
=====================================
true
true
true
=====================================
true
true
false

从运行结果来看,C继承于BB继承于A,那么任何一个类均可以isAssignableFrom其自己,这个从中文意思来理解就是能够从哪个装换而来,自身装换而来确定是没有问题的,父类能够由子类装换而来也是没有问题的,因此A能够由B装换而来,同时也能够由子类的子类转换而来。code

上面的代码也说明一点,全部的类,其最顶级的父类也是Object,也就是全部的类型均可以转换成为Object对象

2.2 接口的实现关系测试

interface InterfaceA{
}

class ClassB implements InterfaceA{

}
class ClassC implements InterfaceA{

}
class ClassD extends ClassB{

}
public class InterfaceTest {
    public static void main(String[] args) {
        System.out.println(InterfaceA.class.isAssignableFrom(InterfaceA.class));
        System.out.println(InterfaceA.class.isAssignableFrom(ClassB.class));
        System.out.println(InterfaceA.class.isAssignableFrom(ClassC.class));
        System.out.println(ClassB.class.isAssignableFrom(ClassC.class));
        System.out.println("============================================");

        System.out.println(ClassB.class.isAssignableFrom(ClassD.class));
        System.out.println(InterfaceA.class.isAssignableFrom(ClassD.class));
    }
}

输出结果以下:继承

true
true
true
false
============================================
true
true

从上面的结果看,其实接口的实现关系和类的实现关系是同样的,没有什么区别,可是若是BC都实现了同一个接口,他们之间实际上是不能互转的。

若是B实现了接口AD继承了B,实际上D是能够上转为A接口的,至关于D间接实现了A,这里也说明了一点,其实继承关系和接口实现关系,在isAssignableFrom()的时候是同样的,一视同仁的。

3.总结

isAssignableFrom是用来判断子类和父类的关系的,或者接口的实现类和接口的关系的,默认全部的类的终极父类都是Object。若是A.isAssignableFrom(B)结果是true,证实B能够转换成为A,也就是A能够由B转换而来。

这个方法在咱们平时使用的很少,可是不少源码里面判断两个类之间的关系的时候,(注意:是两个类的关系,不是两个类的实例对象的关系!!!),会使用到这个方法来判断,大概由于框架代码或者底层代码都是通过多层抽象,作到容易拓展和解耦合,只能如此。

【做者简介】
秦怀,公众号【秦怀杂货店】做者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界但愿一切都很快,更快,可是我但愿本身能走好每一步,写好每一篇文章,期待和大家一块儿交流。

此文章仅表明本身(本菜鸟)学习积累记录,或者学习笔记,若有侵权,请联系做者核实删除。人无完人,文章也同样,文笔稚嫩,在下不才,勿喷,若是有错误之处,还望指出,感激涕零~

相关文章
相关标签/搜索