instanceof java 原理_JAVA中 instanceof 和 getClass() 区别小结
在进行对象之间的比较时会需要针对两个对象的类属性值进行比较,此时可以选择 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() 区别小结相关推荐
- java ==和===_java中==和equals的区别详解
分析前基础了解: 一)JVM把内存划分成两种:一种是栈内存,一种是堆内存. ①在函数中定义的一些基本类型的变量和对象的引用变量(变量名)都在函数的栈内存中分配. ②当在一段代码块定义一个变量时,Jav ...
- java equals getclass_java中instanceof和getClass()的作用
初学者难免有点混淆java中instanceof和getClass()的作用, 下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { } ...
- java instanceof 区别_Java 中 instanceof 和 isInstance 的区别
今天百度了一下 instanceof 和 isInstance() 的区别,结果不理想.大多数人先贴一段测试代码,然后分别解释它们的用法,根本不是解释它们之间的区别. 本来想快点搜一下看个结论,不料还 ...
- java instanceof用法_java中instanceof用法
转自https://www.cnblogs.com/bkyshichao/p/7090401.html Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.inst ...
- java中instanceof 详解_java中的instanceof用法详解
instanceof是Java的一个二元操作符(运算符),也是Java的保留关键字.它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据.用它来判断某个对象是否是某个Clas ...
- java condition原理_java中Condition接口原理及实现
Condition是在java 1.5中才出现的,它用来替代传统的Object的wait().notify()实现线程间的协作,相比Object的wait().notify(),使用Condition ...
- java引_JAVA中的引用
JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...
- java 事务_Java中事务总结详解(精华)
1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (is ...
- java 难度_java中难度大一点的面试题
1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...
最新文章
- 一文带你了解 MySQL 中的各种锁机制!
- 教你如何提高双目立体视觉系统的精度
- 【Linux】 任务调度/计划 cron
- TCP/IP协议各层首部汇总
- Flink-java读取Kafka(转载+自己验证)
- uva 524(Prime Ring Problem UVA - 524 )
- linux内核 task cmd,linux内核
- 关于MySql5“data too long for column”问题的探解
- SQL 2017——新功能
- Linux内核 设备树操作常用API【转】
- d - 数据结构实验之查找四:二分查找_数据结构与算法笔记
- c++ string replace_「Java学习」String,StringBuffer和StringBuilder的区别
- 如何将MyEclipse开发的项目导入到Eclipse中运行
- 漫谈多模光纤类型:OM1、OM2、OM3、OM4、OM5,深度好文,值得阅读
- 2022蓝桥杯——砍竹子
- 【转】奇文共欣赏,疑义相与析:原文转载《电脑维护技巧》(N条举措N条理由)并请大家交流研讨...
- excel中如何冻结前三行或者其他行
- 07.26爬虫request模块之药监局学习笔记
- 网课python程序设计答案_Python程序设计知到网课答案
- Javaweb学习之中文乱码问题
热门文章
- [转]Http请求中Content-Type讲解以及在Spring MVC中的应用
- Redis的C++ client表、Json的C++ client表|汇总|大全
- osharp3使用经验:整合DbContextScope 文章 1
- HDOJ1020 Encoding
- ChaLearn Gesture Challenge_3:Approximated gradients源码简单分析
- Linux下Socket网络编程send和recv使用注意事项
- #ifdef __cplusplus extern C { #endif”的定义
- Docker入门之常用命令
- jdk生成keystore、tomcat配置https
- 关于类型的存储时间和链接