美文网首页
java的instance详解

java的instance详解

作者: 程序员的交流电 | 来源:发表于2019-11-29 22:33 被阅读0次

instance的主要作用是判断一个对象是否是类的实例

public class Mytests {
    public static void main(String[] args) {
        A a=new C();
        System.out.println(a instanceof A);
        System.out.println(a instanceof B);
        System.out.println(a instanceof C);
    }
}
class A{}
class B extends A{}
class C extends B{}
//输出结果
true
true
true

我们看到instance的确是起作用了,但是对于父类,instance也是返回true的,这个不是我们想要的结果,我们只想要a instance C为true,其他的为flase,只想当为真实类型的时候返回true。

Class的equals方法

class的equals方法可以实现这个功能,它只会对真实的类型返回ture

public class Mytests {
    public static void main(String[] args) {
        A a=new C();
        System.out.println(a.getClass().equals(A.class));
        System.out.println(a.getClass().equals(B.class));
        System.out.println(a.getClass().equals(C.class));
    }
}
class A{}
class B extends A{}
class C extends B{}
//输出结果
false
false
true

上面的输出结果就是我想要的,让我们看一下底层的原理吧
java有一个Class类,他是描述类的类,你可以理解为类的元数据。每一个对象,都会由一个class创建出来的。,并且创建出来的对象有这个class的引用,所以,这里的class的equals底层其实直接的判断他们的地址是否相同,只要相同就返回true。还要注意的是,这里的equals并不是class的,其实是Object的

public boolean equals(Object obj) {
        return (this == obj);
    }

所以,其实无论创建多少个Integer对象,他们的getClass()返回的都是相同的Integer的引用。
注意 ,a instanceof b的结果和b.class.isInstance(a)的结果是一致的,可以实现相同的功能,完全等价。
要是想要获取对象的父类和接口信息,同样在class中也有对应的方法。
获取父类的信息:getSupperClass()
获取接口的信息:getInterface()
获取当前对象类的名称:getName(),getTypeName(),getCanonicalName(),getSimpleName()
其中getSimpleName是获取当前的类名的。
而对于getName(),getTypeName(),getCanonicalName(),他们在大多数的情况下面是相同的,但对于数组和内部类就不一样了

A[] a={};
        System.out.println(a.getClass().getName());
        System.out.println(a.getClass().getTypeName());
        System.out.println(a.getClass().getCanonicalName());
        System.out.println(a.getClass().getSimpleName());
//输出结果
[Lcom.zhiyou.A;
com.zhiyou.A[]
com.zhiyou.A[]
A[]
----------------------------------------------------
//内部类
A.D a=new A.D();
        System.out.println(a.getClass().getName());
        System.out.println(a.getClass().getTypeName());
        System.out.println(a.getClass().getCanonicalName());
        System.out.println(a.getClass().getSimpleName());
//输出结果
com.zhiyou.A$D
com.zhiyou.A$D
com.zhiyou.A.D
D

面试考点
在日常的面试当中,instance一般会考察是否只对对象那个的创建类返回true,还有如果只对创建对象的类返回true。要着重理解对象和class的之间的关系和在内存里面对象是符合保存class的引用的(深入理解java虚拟机一书中有讲解)。

相关文章

网友评论

      本文标题:java的instance详解

      本文链接:https://www.haomeiwen.com/subject/llsawctx.html