Java instanceof 和 Class.isInstance()区别与应用
一、instanceof 关键字
instanceof 关键字用于判断某个实例是否是某个类的实例化对象,形如:
String.class instanceof Class
"test" instanceof String
二、isInstance()方法
isInstance是Class类中的方法,也是用于判断某个实例是否是某个类的实例化对象,但是指向则相反。
但这样就带来一个疑问,为什么我们需要这个方法呢,官方文档如此解释:
Determines if the specified Object is assignment-compatible with the object represented by this Class.
This method is the dynamic equivalent of the Java language instanceof operator.
The method returns true if the specified Object argument is non-null
and can be cast to the reference type represented by this Class object without raising a ClassCastException.
It returns false otherwise.
加粗的部分就是主要的区别,主要突出一点:
动态等效(dynamic equivalent)
但是这样并不容易理解,动态等效,虽然字面意思是运行时等效,一个例子会方便理解一些。
- 0 instance of String 本身就会报错 String.class.isInstance(0)则可行。
有了这点特性,我们可以在运行时判断两个类是否可以相互强转。
三、示例用法
public static void main(String[] args) {
System.out.println("\"test\" instance of String:"+("test" instanceof String));
System.out.println("\"test\" instance of Object:"+("test" instanceof Object));
System.out.println("\"test\".getClass().isInstance(Object.class):"+("test".getClass().isInstance(Object.class)));
System.out.println("\"test\".getClass().isInstance(String.class):"+("test".getClass().isInstance(String.class)));
System.out.println("String.class.isInstance(Object.class):"+(String.class.isInstance(Object.class)));
System.out.println("String.class.isInstance(String.class):"+(String.class.isInstance(String.class))); System.out.println("String.class.isInstance(\"test\"):"+(String.class.isInstance("test"))); System.out.println("Object.class.isInstance(\"test\"):"+(Object.class.isInstance("test")));
Object object="ok";
System.out.println("Double.class.isInstance(\"test\"):"+(Double.class.isInstance("test"))); Set<?> a=new HashSet<String>();
Set<String> b=new HashSet<String>();
System.out.println("a is b:"+aIsB(a,b));
} static boolean aIsB(Object a,Object b){
return a.getClass().isInstance(b);
}
输出:
"test" instance of String:true
"test" instance of Object:true
"test".getClass().isInstance(Object.class):false
"test".getClass().isInstance(String.class):false
String.class.isInstance(Object.class):false
String.class.isInstance(String.class):false
String.class.isInstance("test"):true
Object.class.isInstance("test"):true
Double.class.isInstance("test"):false
a is b:true
Java instanceof 和 Class.isInstance()区别与应用的更多相关文章
- 【Java 基础】 instanceof和isInstance区别详解
obj instanceof class 也就是说这个对象是不是这种类型, 1.一个对象是本身类的一个对象 2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象 3.所有对象都是Obj ...
- java instanceof和isInstance的关系 精析
1.instanceof 用途:判断这个object对象是不是这种Class类型. 语法: boolean result = object instanceof Class; 用法: 判断obje ...
- java 的==和equals的区别(二)
java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...
- Java标识符和关键字的区别!java基础 java必学
任何计算机语言都离不开标识符和关键字,那我们就来简单讲一下他们两者的区别,希望有助于大家的的理解!本篇文章干货满满,如果你觉得难懂的话可以看下高淇老师讲的Java300集的教学视频,分选集,深度剖析了 ...
- java 接口和抽象类的区别
java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...
- JDK与Java SE/EE/ME的区别
1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...
- java 静态方法和实例方法的区别
转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...
- java中ArrayList 、LinkList区别
转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...
- C++ 'dynamic_cast' and Java 'instanceof' 使用对比
在Java中,如果A是基类,B是A的派生类,那么instanceof可以用来判断一个实例对象是A还是B,相当于一个二元操作符,但与==, >, < 不同的是,它是由字母组成,是Java的保 ...
随机推荐
- Feign 调用丢失Header的解决方案
问题 在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题. 解决方案 首先需要写一个 Feign请求拦截器,通 ...
- ASP.NET Core 3 使用原生 依赖注入 集成 AspectCore ,实现 AOP 功能
在NETCORE中可以使用AOP的方式有很多很多,包括国内优秀的开源框架asp.netcore同样可以实现AOP编程模式. IOC方面,个人喜欢net core 3自带的DI,因为他注册服务简洁优 ...
- 自制window下core animation引擎 - demo第二弹 - 仿QQ电脑管家加速小火箭
一年前想写一个像cocoa那样,可以方便层动画开发的引擎,写着写着又逆向它的QuartzCore.framework,也就是CoreAnimation的底层,已经大半年没有搞windows这个引擎.大 ...
- 给公司写的composer包开发的规范
版本格式 主版本号.次版本号.修订号 版本号递增规则 主版本号:当你做了不兼容的 API 修改 次版本号:当你做了向下兼容的功能性新增 修订号:当你做了向下兼容的问题修正 先行版本号及版本编译元数据可 ...
- ubuntu 交叉编译 busybox 1.31.1
目的:静态编译 Busybox_arm64 1.13.1 环境:Ubuntu 18.04.3 #----------------环境配置 # aarch64-linux-gnu-g++ sudo ap ...
- python+selenium +unittest生成HTML测试报告
python+selenium+HTMLTestRunner+unittest生成HTML测试报告 首先要准备HTMLTestRunner文件,官网的HTMLTestRunner是python2语法写 ...
- Service Mesh 是新瓶装旧酒吗?
点击下载<不一样的 双11 技术:阿里巴巴经济体云原生实践> 本文节选自<不一样的 双11 技术:阿里巴巴经济体云原生实践>一书,点击上方图片即可下载! 作者 | 李云(花名: ...
- k8s 上部署 Redis 三主三从 集群
目录 介绍 为什么要使用Redis? 什么是Redis群集? 在Kubernetes中部署Redis集群 从 GitHub 上下载: 创建pv 创建statefulset 创建service 初始化 ...
- 以Python为例的Async / Await的编程基础
来源:Redislabs 作者:Loris Cro 翻译:Kevin (公众号:中间件小哥) 近年来,许多编程语言都在努力改进它们的并发原语.Go 语言有 goroutines,Ruby 有 fibe ...
- js如何衔接css3的多个@keyframes动画?
css3特效动画,我们在编写页面中经常遇到,而且是在同一个div模块上有多个衔接的不同动画,css中,我们经常使用animation-delay (规定在动画开始之前的延迟)进行处理. 那么,下面分享 ...