一、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()区别与应用的更多相关文章

  1. 【Java 基础】 instanceof和isInstance区别详解

    obj instanceof class 也就是说这个对象是不是这种类型, 1.一个对象是本身类的一个对象 2.一个对象是本身类父类(父类的父类)和接口(接口的接口)的一个对象 3.所有对象都是Obj ...

  2. java instanceof和isInstance的关系 精析

      1.instanceof 用途:判断这个object对象是不是这种Class类型. 语法: boolean result = object instanceof Class; 用法: 判断obje ...

  3. java 的==和equals的区别(二)

    java 的==和equals的区别 java 的==和equals的区别 ==通常表明引用的是同一个东西(引用的地址相同),equals通常表明两个对象的内容相同(值相同) ------------ ...

  4. Java标识符和关键字的区别!java基础 java必学

    任何计算机语言都离不开标识符和关键字,那我们就来简单讲一下他们两者的区别,希望有助于大家的的理解!本篇文章干货满满,如果你觉得难懂的话可以看下高淇老师讲的Java300集的教学视频,分选集,深度剖析了 ...

  5. java 接口和抽象类的区别

    java 接口和抽象类的区别抽象类:1.含有抽象方法的类一定为抽象类,反过来抽象类,不一定含有抽象方法:2.抽象类必须用abstract来进行定义,抽象方法也必须用abstract来进行定义:3.抽象 ...

  6. JDK与Java SE/EE/ME的区别

    1. Java SE(Java Platform,Standard Edition). Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用 ...

  7. java 静态方法和实例方法的区别

    转自 java 静态方法和实例方法的区别 静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法 ...

  8. java中ArrayList 、LinkList区别

    转自:http://blog.csdn.net/wuchuanpingstone/article/details/6678653 个人建议:以下这篇文章,是从例子说明的方式,解释ArrayList.L ...

  9. C++ 'dynamic_cast' and Java 'instanceof' 使用对比

    在Java中,如果A是基类,B是A的派生类,那么instanceof可以用来判断一个实例对象是A还是B,相当于一个二元操作符,但与==, >, < 不同的是,它是由字母组成,是Java的保 ...

随机推荐

  1. ESP8266 使用AT指令

    ESP8266 使用AT指令 问题:串口调试工具输入AT指令没返回结果 分析板子有两种模式 下载模式(默认) 运行模式 解决办法: 方法一:按下板子上的 RST 键位 方法二:使用 [安信可串口调试工 ...

  2. nyoj 54-小明的存钱计划 (遍历 + 判断)

    54-小明的存钱计划 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:5 submit:11 题目描述: 小明的零花钱一直都是自己管理.每个月的月初妈 ...

  3. 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor

    最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...

  4. DNS简单配置

    ——主要执行的程序:/usr/sbin/named ——系统服务:named ——默认端口:53 ——运行时的虚拟根环境:/var/named/chroot ——主配置文件:/etc/named.co ...

  5. Web Deploy远程发布

    前言 我们在使用VS开发.net网站的时候,部署时可能会遇到缺少dll的问题,每次都远程桌面登陆,然后拷贝过去,太麻烦了.我们可以使用Web Deploy这个远程部署工具,不仅部署容易了,也方便进行迭 ...

  6. mac如何开启两个vmware虚拟机

    转载链接:https://blog.csdn.net/aifore/article/details/87833088

  7. cognos服务器性能测试诊断分析优化过程记录

    前段时间客户方一个系统上线后出现性能问题,就是查询报表的时候出现宕机现象,应项目组要求过去帮忙测试优化问题.  该项目的架构相对比较复杂,登录后要先进行认证服务器认证用户然后登录到应用系统A,在跳转到 ...

  8. linux runlevel运行级别

    1.linux通过设定runlevel来设定系统使用不同的服务启动,从而使得linux运行的环境有所不同. 2.当系统启动后会按照以下步骤完成初始化:运行/sbin/init程序加载器配置文件/etc ...

  9. linuxshell编程之数组和字符串处理工具

    数组:存放多个元素的连续内存空间. 声明数组:bash-4以后支持除默认的0,1,2……还可以自定义索引格式,此类数组称之为“关联数组” 声明索引数组:declare -a NAME 声明关联数组:d ...

  10. 在React项目中添加ESLint

    1. 安装eslint npm install eslint --save-dev // 或者 yarn add eslint --dev 2. 初始化配置文件 npx eslint --init / ...