专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java判断对象类型的方法

Java判断对象类型的方法

更新时间:2022-12-21 12:15:16 来源:动力节点 浏览5317次

Java判断对象类型的方法是什么?动力节点小编来告诉大家。

1.instanceof

关键字instanceof

不仅可以判断对象是否是某个类的实例

甚至连该类继承的基类和实现的接口也都能够被识别为true

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");
    }
}

类定义为:

public abstract class Number implements java.io.Serializable {}
public final class Integer extends Number implements Comparable<Integer> {}

运行结果:

Integer i is a Number
Integer i is a Serializable
Integer i is an Integer
Integer i isn't a Float

根据结果可知:虽然instanceof在逻辑上没有任何问题,是可以把Integer当做一个Number来看来用,也当做一个Serializable来看来用,但是这样返回的结果就没有针对性了,太过于模糊,如果仅仅需要i instanceof Integer为true该怎么做呢?

2.Class.equals

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。

查看源代码发现,equals函数用的就是Object中的方法,没有重写:

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

由此可知:

无论我们用Integer实例化多少个对象,当我们调用getClass()方法时返回的总是同一个类对象,即Integer.class。所以上面的i.getClass().equals(Number.class) 和 i.getClass == Number.class 是等价的。事实上每个类都会有且只有一个对应Class的对象,我们正是用这个Class对象来实例化该类的所有对象的,也就是Class中的newInstance()方法。

如果想获取更多有关于对象i的类型信息呢?比如获取它的基类呢?Class的对象中还有些方法用于获取父类、实现接口、类型名称的方法:

获取父类的类型信息:getSuperclass()

获取实现的接口的类型信息:getInterfaces()

获取类型名称:getName()、getSimpleName()、getCanonicalName()

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>