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虚拟机一书中有讲解)。
网友评论