背景故事

《曾经最美》是朱铭捷演唱的一首歌曲,由陈佳明填词,叶良俊谱曲,是电视剧《水晶之恋》的主题曲。歌曲时长4分28秒。 歌曲歌词:

看不穿你的眼睛

藏有多少悲和喜

像冰雪细腻又如此透明

仿佛片刻就要老去

整个城市的孤寂

不止一个你

只能远远的

想像慰藉我们之间的距离

我又不是你的谁

不能带给你安慰

忍心你枯萎凋零的玫瑰

仿佛希望化成灰

要不是痛彻心扉

谁又记得谁

只是云和月

相互以为是彼此的盈缺

不能哭喊已破碎

曾经的最美

独自一个人熟悉的街

别问你在想谁

不去追悔已憔悴

爱过的机会

真实已粉碎人事已非

还有什么最可贵

我又不是你的谁

不能带给你安慰

忍心你枯萎凋零的玫瑰

仿佛希望化成灰

要不是痛彻心扉

谁又记得谁

只是云和月

相互以为是彼此的盈缺

不能哭喊已破碎

曾经的最美

独自一个人熟悉的街

别问你在想谁

不去追悔已粉碎

爱过的机会

真实已粉碎人事已非

还有什么最可贵

不能哭喊已破碎

曾经的最美

独自一个人熟悉的街

别问你在想谁

不去追悔已憔悴

爱过的机会

真实已粉碎人事已非

还有什么最可贵

牵线之牛刀小试

如何判断是不是谁的谁?java有一个instanceof操作符(关系操作符)可以做这件事。

public static voidmain(String[] args) {

String s= "Hello World!";

System.out.println(sinstanceofString);

}

打印出结果true

可是如果你的哪个谁不存在呢?请看代码:

public static voidmain(String[] args) {

String s= null;

System.out.println(sinstanceofString);

}

很多人都会异口同声的说

false

你答对了。

JSL-15.20.2规定

At run time, the result of the instanceof operator is true if the value of the RelationalExpression is not null and the reference could be cast to the ReferenceType without raising a ClassCastException. Otherwise the result is false.

牵线之乱点鸳鸯谱

如果没有任何关系的两个类使用instanceof会如何?

class Point { intx, y; }class Element { intatomicNumber; }public classInstanceofTest {public static voidmain(String[] args) {

Point p= newPoint();

Element e= newElement();if (e instanceof Point) {

System.out.println("匹配成功!");

}else{

System.out.println("匹配不成功");

}

}

}

不少人会说:“匹配不成功”

抱歉,你又掉进坑里了,这个会报编译错误

JSL-15.20.2规定

The type of the RelationalExpression operand of the instanceof operator must be a reference type or the null type, or a compile-time error occurs.

It is a compile-time error if the ReferenceType mentioned after the instanceof operator does not denote a reference type that is reifiable (§4.7).

If a cast of the RelationalExpression to the ReferenceType would be rejected as a compile-time error (§15.16), then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.

当然,cast也会是编译错误

class Point { intx, y; }class Element { intatomicNumber; }public classInstanceofTest {public static voidmain(String[] args) {

Point p= newPoint();

Element e= newElement();

p= (Point)e; //compile-time error

}

}

牵线之暗藏玄机

编译器并不是万能的,并不能检测出所有问题,看下面:

class Point { intx, y; }class Element { intatomicNumber; }public classInstanceofTest {public static voidmain(String[] args) {

Point p= newPoint();//Element e = new Element();

p = (Point) newObject();

System.out.println(pinstanceofPoint);

}

}

猛一看,没事问题,编译也没有问题,可是运行时报错

Exception in thread "main" java.lang.ClassCastException: java.lang.Object cannot be cast to Point

上面的程序展示了当要被转型的表达式的静态类型是转型类型的超类时,转型操作符的行为。与instanceof 操作相同,如果在一个转型操作中的两种类型都是类,那么其中一个必须是另一个的子类型。尽管对我们来说,这个转

型很显然会失败,但是类型系统还没有强大到能够洞悉表达式new Object()的运行期类型不可能是Point的一个子类型。因此,该程序将在运行期抛出ClassCastException 异常。

牵线之竞争激烈

关系操作符instanceof可不是市场上唯一的选择,另外一个背靠大山的家伙要注意了

Class 的方法

booleanisInstance(Object obj)

Determines if the specified Object is assignment-compatible with the object represented by this Class.

那么什么时候该用instanceof 什么时候该用isInstance呢

我的理解是

instanceof偏向于比较class之间

isInstance偏向于比较instance和class之间

stackoverflow也有此问题的解答:

I take that to mean that isInstance() is primarily intended for use in code dealing with type reflection at runtime. In particular, I would say that it exists to handle cases where you might not know in advance the type(s) of class(es) that you want to check for membership of in advance (rare though those cases probably are).

For instance, you can use it to write a method that checks to see if two arbitrarily typed objects are assignment-compatible, like:

public booleanareObjectsAssignable(Object left, Object right) {returnleft.getClass().isInstance(right);

}

In general, I'd say that using instanceof should be preferred whenever you know the kind of class you want to check against in advance. In those very rare cases where you do not, use isInstance() instead.

参考资料

【1】https://docs.oracle.com/javase/specs/jls/se12/html/jls-15.html#jls-15.20.2

【2】java解惑

【3】https://stackoverflow.com/questions/8692214/when-to-use-class-isinstance-when-to-use-instanceof-operator

Java instead of 用法_我又不是你的谁--java instanceof操作符用法揭秘相关推荐

  1. java future用法_你必须掌握的 21 个 Java 核心技术

    作者:工程师-搁浅来源:https://www.jb51.net/article/122070.htm 写这篇文章的目的是想总结一下自己这么多年来使用java的一些心得体会,主要是和一些java基础知 ...

  2. java byte 判断相等_转发收藏 | 史上最全Java面试题+面试网站推荐!(含答案)

    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次.对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦. 相关概念 面向对象的三个 ...

  3. Java中合法的关键词_优秀程序员必须掌握的java中50个关键字

    关键字和保留字的区别 正确识别java语言的关键字(keyword)和保留字(reserved word)是十分重要的.Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表 ...

  4. java se13安装教程_在Linux发行版中安装Java 13/OpenJDK 13的方法

    本文介绍在Linux发行版Ubuntu 18.04/16.04.Debian 10/9.CentOS 7/8.Fedora 31/30/29中安装Java 13/OpenJDK 13.Java SE ...

  5. java高深技术总结_一名25K以上的高薪Java程序员总结出的技术以及学习技能

    原标题:一名25K以上的高薪Java程序员总结出的技术以及学习技能 总所周知,Java是目前使用最为广泛的网络编程语言之一. 它具有简单,面向对象,稳定,与平台无关,解释型,多线程,动态等特点. 一般 ...

  6. 百度java的线程技术_自我提升(基础技术篇)——java线程简介

    前言:虽然自己平时都在用多线程,也能完成基本的工作需求,但总觉得,还是对线程没有一个系统的概念,所以,查阅了一些资料,理解那些大神和官方的资料,写这么一篇关于线程的文章 本来想废话一番,讲讲自己的经历 ...

  7. java增删改查_只会增删改查的Java程序员该如何发展

    首先,对于当前的Java程序员来说,要想在软件开发领域走得更远,应该做好三件事,其一是为自己设定一个主攻方向,其二是根据自身的知识基础和能力特点来制定学习计划,其三是注重行业发展趋势,积极拥抱新技术. ...

  8. java 删除桌面快捷方式_能否在桌面创建快捷方式运行java程序?

    能否在桌面创建快捷方式运行java程序? 来源:互联网  宽屏版  评论 2009-05-07 07:51:17 分类: 电脑/网络 >> 程序设计 >> 其他编程语言 问题描 ...

  9. java职业发展路线图_从程序员到CTO的Java技术路线图 JAVA职业规划 JAVA职业发展路线图 系统后台框架图、前端工程师技能图 B2C电子商务基础系统架构解析...

    http://zz563143188.iteye.com/blog/1877266在技术方面无论我们怎么学习,总感觉需要提升自已不知道自己处于什么水平了.但如果有清晰的指示图供参考还是非常不错的,这样 ...

最新文章

  1. win10系统上安装cmder并实现右键启动
  2. WebService注解
  3. mysql 游标 ,嵌套游标
  4. 软件缺陷的状态有哪些??
  5. php+date+timezoe,PHP 字符串
  6. 本科生完成9篇SCI,担任顶刊审稿人!
  7. 如何从零开始制作智能桌宠?
  8. 使用mmdetection检测并存储结果
  9. webex无法用计算机呼叫,CiscoWebExMeetingsServer疑难解答指引.PDF
  10. 微信计步器怎么不计步_微信运动不显示步数解决方法
  11. 什么是即时通讯?即时通讯的发展
  12. 鸡脚蹬子生长秘籍 鸡脚蹬子短是缺乏什么营养
  13. Go: panic / recover 简介与实践
  14. 专升本第一讲(计算机的“前世今生”)
  15. 从输入 URL 到页面加载完成的过程中都发生了什么事情?
  16. 遥感—以常用夜光遥感卫星介绍为主
  17. 奇趣网站收藏家(网站)
  18. Sculpin Extended:自定义静态站点博客
  19. spider pi 智能视觉六足机器人 巡路功能 0603
  20. WGS84地理坐标系和CGCS2000坐标相互转换

热门文章

  1. com技术内幕 代码_CFan科学院:零门槛极速抠图技术探秘
  2. 基于 Apache Hudi 构建流批一体系统实践
  3. 产品认知:看清事物本质的核心思维——效率思维
  4. 前端使用linux命令更新项目生产包与测试包命令
  5. css3优惠卷上方锯齿_css3怎么实现锯齿边框?
  6. Aspcms框架的webshell
  7. 4阶范德蒙德行列式例题_行列式的性质和计算问题
  8. 室内主题元素分析图_2020届室内设计专业优秀毕业设计作品展(五)
  9. jquery css事件编程 尺寸设置
  10. css布局笔记(二)Flex