判断一个对象是否是一个类的实例,用Java中自带的关键字instanceof
似乎可
以做到(仅从关键字名称上可以猜测出),如下面的代码:
public static void main(String args[]) {
Object i = new Integer(7);
if (i instanceof Number) {
System.out.println("Integer i is a Number");
} else {
System.out.println("Integer i isn't a Number");
}
if (i instanceof Serializable) {
System.out.println("Integer i is a Serializable");
} else {
System.out.println("Integer i isn't a Serializable");
}
if (i instanceof Integer) {
System.out.println("Integer i is an Integer");
} else {
System.out.println("Integer i isn't an Integer");
}
if (i instanceof Float) {
System.out.println("Integer i is a Float");
} else {
System.out.println("Integer i isn't a Float");
}
}
运行结果却出乎意料
Integer i is a Number
Integer i is a Serializable
Integer i is an Integer
Integer i isn't a Float
Process finished with exit code 0
和预期的不太一样,能看出,使用该关键字不仅可以判断对象是否是某个类的实例,甚至连该类继承的基类和实现的接口也都能够被识别为true,虽然这样在逻辑上没有任何问题,是可以把Integer当做一个Number来看来用,也当做一个Serializable来看来用,但是这样返回的结果就没有针对性了,太过于模糊,我们如果仅仅需要i instanceof Integer为true该怎么做呢?
在Java有一个叫做Class
的类,这是一个用来描述类信息的类,我们如果要精确判断一个对象是否是具体的一个类的实例,可以这么做:
public static void main(String args[]) {
Object i = new Integer(7);
if (i.getClass().equals(Number.class)) {
System.out.println("Integer i is a Number");
} else {
System.out.println("Integer i isn't a Number");
}
if (i.getClass().equals(Serializable.class)) {
System.out.println("Integer i is a Serializable");
} else {
System.out.println("Integer i isn't a Serializable");
}
if (i.getClass().equals(Integer.class)) {
System.out.println("Integer i is an Integer");
} else {
System.out.println("Integer i isn't an Integer");
}
if (i.getClass().equals(Float.class)) {
System.out.println("Integer i is a Float");
} else {
System.out.println("Integer i isn't a Float");
}
}
运行结果
Integer i isn’t a Number
Integer i isn’t a Serializable
Integer i is an Integer
Integer i isn’t a Float
这样就能达到我们的目的了,从equals
函数上就可以看出,上述代码是比较两个类的类信息是否一致,全相等,这其中不考虑继承实现的关系,当且仅当该对象是要比较的那个类的实例才返回true。
获取其他类型信息:
获取父类的类型信息:getSuperclass()
获取实现的接口的类型信息:getInterfaces()
获取类型名称:getName()、getSimpleName()、getCanonicalName()