在进行对象之间的比较时会需要针对两个对象的类属性值进行比较,此时可以选择 instanceof 或者 getClass() 进行比较判断。两者都可以用于比较对象之间的类是否相同,但也存在一些区别。

instanceof

使用 instanceof 时会判断该对象是否属于指定类或接口,同时也会判断是否属于其继承类或实现类。如果满足其中一个条件则返回值为 true,否则为 false。测试代码如下:

public class Test {

public static void main(String[] args) {

Object a = new SubClassA();

System.out.println("a instanceof SubClassA is: " + (a instanceof SubClassA));

System.out.println("a instanceof SuperClass is: " + (a instanceof SuperClass));

System.out.println("a instanceof SuperInterface is: " + (a instanceof SuperInterface));

System.out.println("a instanceof SubClassB is: " + (a instanceof SubClassB));

}

}

class SuperClass {

}

interface SuperInterface {

}

class SubClassA extends SuperClass implements SuperInterface {

}

class SubClassB extends SuperClass {

}

上述代码输入如下:

a instanceof SubClassA is: true

a instanceof SuperClass is: true

a instanceof SuperInterface is: true

a instanceof SubClassB is: false

由于 a 对象为 SubClassA 类的实例,且继承了 SuperClass 类,并实现了 SuperInterface 接口,故使用 instanceof 进行判断的时候结果都为 true,而与 SubClassB 类进行比较时则为 false。

getClass()

使用 getClass() 方法进行判断时,由于 getClass() 方法返回值为当前实例对象的 Class 对象,同时 Class 类并未重写 equals() 方法,故进行判断时不论是使用 == 还是使用 equals() 方法都是一样的效果(Object类的 equals() 方法也是使用的 == 进行比较),是比较当前的 Class 对象是否相同。测试代码如下:

public static void main(String[] args) {

Object a = new SubClassA();

System.out.println("a.getClass() == SubClassA.class is: " + (a.getClass() == SubClassA.class));

System.out.println("a.getClass() == SuperClass.class is: " + (a.getClass() == SuperClass.class));

System.out.println("a.getClass() == SuperInterface.class is: " + (a.getClass() == SuperInterface.class));

System.out.println("a.getClass() == SubClassB.class is: " + (a.getClass() == SubClassB.class));

}

上述代码输入如下:

a.getClass() == SubClassA.class is: true

a.getClass() == SuperClass.class is: false

a.getClass() == SuperInterface.class is: false

a.getClass() == SubClassB.class is: false

由于 a 对象为 SubClassA 类的实例,通过 getClass() 方法进行判断时不会对其父类或其接口类进行关联,故对应判断结果都为 false。

通过上述比较可知,使用 instanceof 进行类的判断时,只要左边的对象是右边的类的子类或实现类时均可成立。而使用 getClass() 方法进行判断时,需要严格判断是否为相同类的对象。

instanceof java 原理_JAVA中 instanceof 和 getClass() 区别小结相关推荐

  1. java ==和===_java中==和equals的区别详解

    分析前基础了解: 一)JVM把内存划分成两种:一种是栈内存,一种是堆内存. ①在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配. ②当在一段代码块定义一个变量时,Jav ...

  2. java equals getclass_java中instanceof和getClass()的作用

    初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解. 父类A: class A { }    子类B: class B extends A { }    ...

  3. java instanceof 区别_Java 中 instanceof 和 isInstance 的区别

    今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想.大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别. 本来想快点搜一下看个结论,不料还 ...

  4. java instanceof用法_java中instanceof用法

    转自https://www.cnblogs.com/bkyshichao/p/7090401.html Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.inst ...

  5. java中instanceof 详解_java中的instanceof用法详解

    instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...

  6. java condition原理_java中Condition接口原理及实现

    Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作,相比Object的wait().notify(),使用Condition ...

  7. java引_JAVA中的引用

    JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...

  8. java 事务_Java中事务总结详解(精华)

    1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (is ...

  9. java 难度_java中难度大一点的面试题

    1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...

最新文章

  1. 一文带你了解 MySQL 中的各种锁机制!
  2. 教你如何提高双目立体视觉系统的精度
  3. 【Linux】 任务调度/计划 cron
  4. TCP/IP协议各层首部汇总
  5. Flink-java读取Kafka(转载+自己验证)
  6. uva 524(Prime Ring Problem UVA - 524 )
  7. linux内核 task cmd,linux内核
  8. 关于MySql5“data too long for column”问题的探解
  9. SQL 2017——新功能
  10. Linux内核 设备树操作常用API【转】
  11. d - 数据结构实验之查找四:二分查找_数据结构与算法笔记
  12. c++ string replace_「Java学习」String,StringBuffer和StringBuilder的区别
  13. 如何将MyEclipse开发的项目导入到Eclipse中运行
  14. 漫谈多模光纤类型:OM1、OM2、OM3、OM4、OM5,深度好文,值得阅读
  15. 2022蓝桥杯——砍竹子
  16. 【转】奇文共欣赏,疑义相与析:原文转载《电脑维护技巧》(N条举措N条理由)并请大家交流研讨...
  17. excel中如何冻结前三行或者其他行
  18. 07.26爬虫request模块之药监局学习笔记
  19. 网课python程序设计答案_Python程序设计知到网课答案
  20. Javaweb学习之中文乱码问题

热门文章

  1. [转]Http请求中Content-Type讲解以及在Spring MVC中的应用
  2. Redis的C++ client表、Json的C++ client表|汇总|大全
  3. osharp3使用经验:整合DbContextScope 文章 1
  4. HDOJ1020 Encoding
  5. ChaLearn Gesture Challenge_3:Approximated gradients源码简单分析
  6. Linux下Socket网络编程send和recv使用注意事项
  7. #ifdef __cplusplus extern C { #endif”的定义
  8. Docker入门之常用命令
  9. jdk生成keystore、tomcat配置https
  10. 关于类型的存储时间和链接