java中判断对象类型的3种方法举例

 更新时间:2024年01月26日 16:00:55   作者:内师-ZT  
在Java这种强类型语言中类型转换、类型判断是经常遇到的,下面这篇文章主要给大家介绍了关于java中判断对象类型的3种方法,文中通过代码介绍的非常详细,需要的朋友可以参考下

instanceof关键字

instanceof 是 Java 中的一个关键字,用于判断一个对象是否是指定类型或其子类型的实例。它的使用格式为:

对象 instanceof 类型

其中,对象 是待判断的对象,类型 是要判断的类型。

instanceof 的返回值是一个布尔值,如果对象是指定类型或其子类型的实例,则返回 true,否则返回 false

instanceof 主要用于类型判断或类型转换的场景,常见的用法有:

  • 判断对象的实际类型并执行相应的操作,避免类型转换错误。
  • 判断对象是否属于某个接口的实现类,以便进行接口方法的调用。
  • 多态的场景中,判断对象所属的具体子类,以实现相应的逻辑。

示例代码:

class Animal { } // 父类
class Dog extends Animal { } // 子类

Animal animal = new Dog(); // 创建一个子类的实例
System.out.println(animal instanceof Dog); // 输出:true,因为 animal 是 Dog 的实例
System.out.println(animal instanceof Animal); // 输出:true,因为 animal 是 Animal 的实例
System.out.println(animal instanceof Object); // 输出:true,因为 animal 是 Object 的实例

Animal animal2 = new Animal(); // 创建一个父类的实例
System.out.println(animal2 instanceof Dog); // 输出:false,因为 animal2 不是 Dog 的实例

需要注意的是,在使用 instanceof 进行类型判断时,被判断的对象不能为 null,否则会抛出 NullPointerException

另外值得注意的是,当对象为空时,使用instanceof任何时候都是返回false的

Object o = null;
TestType t = null;
System.out.println(null instanceof Object); // 打印结果:false
System.out.println(o instanceof Object); // 打印结果:false
System.out.println(t instanceof Object); // 打印结果:false

instanceof操作符虽然好用,但是在一些情况下是会发生编译错误的:

1.已知没有类继承关系的两个类使用instanceof操作符会发生编译错误

Object o = new TestType();
TestType t = new TestType();
System.out.println(o instanceof TestType2); // 编译通过,Object类是所有类的父类,所以在这里,编译器认为对象o的类是位置的
System.out.println(t instanceof TestType2); // 编译错误,TestType和TestType2没有类继承关系,虽然他们继承了同一个父类、实现了同一接口

2.在对象属于基础数据类型时会发生编译错误,如直接使用(1、true),或者先声明后使用(int a = 1,使用a对象)时,则会发生编译错误。以下情况均会产生编译错误

System.out.println(((byte)1) instanceof Object);
System.out.println(((short)1) instanceof Object);
System.out.println(1L instanceof Object);
System.out.println(1 instanceof Object);
System.out.println(1.1F instanceof Object);
System.out.println(1.20D instanceof Object);
System.out.println('a' instanceof Object);
System.out.println(true instanceof Object);

使用 getClass() 方法

在 Java 中,每个对象都有一个 getClass() 方法,可以返回对象的运行时类型,即对象所属的类。它返回的是一个 Class 对象,代表类的元数据信息。通过 getClass() 方法可以判断对象的具体类型。

示例代码:

class Animal { } // 父类
class Dog extends Animal { } // 子类

Animal animal = new Animal(); // 创建一个父类实例
Dog dog = new Dog(); // 创建一个子类实例

System.out.println(animal.getClass()); // 输出:class Animal
System.out.println(dog.getClass()); // 输出:class Dog

需要注意的是,getClass() 方法返回的是对象的运行时类型,而不是变量的声明类型。也就是说,如果一个变量的声明类型是父类,但是实际引用的是子类的实例,那么 getClass() 方法返回的是子类的类型。

示例代码:

Animal animal = new Dog(); // 创建一个子类实例
System.out.println(animal.getClass()); // 输出:class Dog,因为实际引用的是子类的实例

可以通过 getClass() 方法判断对象的具体类型,并根据具体类型执行相应的逻辑。这在某些情况下比使用 instanceof 更灵活,但需要注意类型的继承关系和多态的特性。

使用反射机制

使用 Class.forName() 方法可以通过类的全限定名来获取对应的 Class 对象,进而判断对象的类型。这个方法可以在运行时动态加载类,并返回相应的 Class 对象。

示例代码:

class Animal { } // 父类
class Dog extends Animal { } // 子类

Animal animal = new Animal(); // 创建一个父类实例
Dog dog = new Dog(); // 创建一个子类实例

String animalClassName = animal.getClass().getName();
String dogClassName = dog.getClass().getName();

try {
    Class<?> animalClass = Class.forName(animalClassName);
    if (animalClass.equals(Animal.class)) {
        System.out.println("animal 是 Animal 类型");
    } else if (animalClass.equals(Dog.class)) {
        System.out.println("animal 是 Dog 类型");
    }
    
    Class<?> dogClass = Class.forName(dogClassName);
    if (dogClass.equals(Animal.class)) {
        System.out.println("dog 是 Animal 类型");
    } else if (dogClass.equals(Dog.class)) {
        System.out.println("dog 是 Dog 类型");
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

在上述代码中,通过 getClass().getName() 方法获取对象的类的全限定名,然后使用 Class.forName() 方法传入全限定名来获取对应的 Class 对象。然后可以使用 equals() 方法进行类型判断,输出相应的结果。

需要注意的是,Class.forName() 方法需要处理可能抛出的 ClassNotFoundException 异常,因为它需要找到指定的类。在传入类名时,应确保类已经在 classpath 中,否则会抛出异常。

使用 Class.forName() 方法进行类型判断可以在运行时动态加载类,并根据类的全限定名来获取对应的 Class 对象。这种方式适用于在编译时无法确定类的类型,或者需要在运行时根据配置文件或其他外部条件来确定类的类型的场景。

总结

到此这篇关于java中判断对象类型的3种方法的文章就介绍到这了,更多相关java判断对象类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用SpringBoot框架来接收multipart/form-data文件方式

    用SpringBoot框架来接收multipart/form-data文件方式

    这篇文章主要介绍了用SpringBoot框架来接收multipart/form-data文件方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Spring框架中ImportBeanDefinitionRegistrar的应用详解

    Spring框架中ImportBeanDefinitionRegistrar的应用详解

    这篇文章主要介绍了Spring框架中ImportBeanDefinitionRegistrar的应用详解,如果实现了ImportSelector接口,在配置类中被@Import加入到Spring容器中以后,Spring容器就会把ImportSelector接口方法返回的字符串数组中的类new出来对象然后放到工厂中去,需要的朋友可以参考下
    2024-01-01
  • 浅谈PrintStream和PrintWriter的区别和联系

    浅谈PrintStream和PrintWriter的区别和联系

    这篇文章主要介绍了浅谈PrintStream和PrintWriter的区别和联系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-03-03
  • java多线程Future和Callable类示例分享

    java多线程Future和Callable类示例分享

    JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。今天我们就来研究下Future和Callable的实现方法
    2016-01-01
  • Spring Security如何基于Authentication获取用户信息

    Spring Security如何基于Authentication获取用户信息

    这篇文章主要介绍了Spring Security如何基于Authentication获取用户信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • spring通过jdbc连接数据库

    spring通过jdbc连接数据库

    这篇文章主要为大家详细介绍了spring通过jdbc连接数据库的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • Java常见延迟队列的实现方案总结

    Java常见延迟队列的实现方案总结

    Java延迟队列(DelayQueue)是Java并发包中的一个类,它实现了BlockingQueue接口,且其中的元素必须实现Delayed接口,延迟队列中的元素按照延迟时间的长短进行排序,本文给大家介绍了Java常见延迟队列的实现方案总结,需要的朋友可以参考下
    2024-03-03
  • Spring MVC获取查询参数及路径参数代码实例

    Spring MVC获取查询参数及路径参数代码实例

    这篇文章主要介绍了Spring MVC获取查询参数及路径参数代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Java判断101-200之间有多少个素数并输出

    Java判断101-200之间有多少个素数并输出

    这篇文章主要介绍了Java判断101-200之间有多少个素数并输出,需要的朋友可以参考下
    2017-02-02

最新评论