前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教妹学 Java 第 24 讲:instanceof 操作符

教妹学 Java 第 24 讲:instanceof 操作符

作者头像
沉默王二
发布2021-04-23 11:17:13
3770
发布2021-04-23 11:17:13
举报
文章被收录于专栏:沉默王二

嗨,《教妹学 Java》专栏的同学们,大家好呀,久违了!

连更 23 讲后,感觉实在是太累了!几乎每天都在写文章,再加上工作和生活,完全是一副丧尸的模样,扛不住。于是就不得不停下来脚步,结果这一停,直接停到黄花菜都凉了,很多喜欢这个专栏的同学在后台不停地催啊催!

催催催,于是第 24 讲——instanceof 操作符就来了!这说明催催还是有效果的哈。

“哥,我终于该上场了呀!”三妹调皮的说,“这段时间,我可急坏了!”

“我的亲妹妹呀,作为补偿,五一我带你去张家界玩,怎么样?到时候再给哥拍点帅照作为封面,还有你的,主要是作为同学们的福利~”我瞥了一眼旁边的三妹,一听到我要带她出去玩,脸上立马是一副期待的样子。

“那哥,你赶紧开始吧,我要学起来了!”


instanceof 操作符的用法其实很简单:

代码语言:javascript
复制
(object) instanceof (type)

用意也非常简单,判断对象是否符合指定的类型,结果要么是 true,要么是 false。在反序列化的时候,instanceof 操作符还是蛮常用的,因为这时候我们不太确定对象属不属于指定的类型,如果不进行判断的话,就容易抛出 ClassCastException 异常。

我们来建这样一个简单的类 Round:

代码语言:javascript
复制
class Round {
}

然后新增一个扩展类 Ring:

代码语言:javascript
复制
class Ring extends Round {
}

这时候,我们就可以通过 instanceof 来检查 Ring 对象是否属于 Round 类型。

代码语言:javascript
复制
Ring ring = new Ring();
System.out.println(ring instanceof Round);

结果会输出 true,因为 Ring 继承了 Round,也就意味着 Ring 和 Round 符合 is-a 的关系,而 instanceof 操作符正是基于类与类之间的继承关系,以及类与接口之间的实现关系的。

我们再来新建一个接口 Shape:

代码语言:javascript
复制
interface Shape {
}

然后新建 Circle 类实现 Shape 接口并继承 Round 类:

代码语言:javascript
复制
class Circle extends Round implements Shape {
}

如果对象是由该类创建的,那么 instanceof 的结果肯定为 true。

代码语言:javascript
复制
Circle circle = new Circle();
System.out.println(circle instanceof Circle);

这个肯定没毛病,instanceof 就是干这个活的,大家也很好理解。那如果类型是父类呢?

代码语言:javascript
复制
System.out.println(circle instanceof Round);

结果肯定还是 true,因为依然符合 is-a 的关系。那如果类型为接口呢?

代码语言:javascript
复制
System.out.println(circle instanceof Shape);

结果仍然为 true, 因为也符合 is-a 的关系。如果要比较的对象和要比较的类型之间没有关系,当然是不能使用 instanceof 进行比较的。

为了验证这一点,我们来创建一个实现了 Shape 但与 Circle 无关的 Triangle 类:

代码语言:javascript
复制
class Triangle implements Shape {
}

这时候,再使用 instanceof 进行比较的话,编译器就报错了。

代码语言:javascript
复制
 System.out.println(circle instanceof Triangle);

错误信息如下所示:

代码语言:javascript
复制
Inconvertible types; cannot cast 'com.itwanger.twentyfour.instanceof1.Circle' to 'com.itwanger.twentyfour.instanceof1.Triangle'

意思就是类型不匹配,不能转换,我们使用 instanceof 比较的目的,也就是希望如果结果为 true 的时候能进行类型转换。但显然 Circle 不能转为 Triangle。

编译器已经提前帮我们预知了,很聪明。

Java 是一门面向对象的编程语言,也就意味着除了基本数据类型,所有的类都会隐式继承 Object 类。所以下面的结果肯定也会输出 true。

代码语言:javascript
复制
Thread thread = new Thread();
System.out.println(thread instanceof Object);

“那如果对象为 null 呢?”三妹这时候插话了。

“这个还真的是一个好问题啊。”我忍不住对三妹竖了一个大拇指。

代码语言:javascript
复制
System.out.println(null instanceof Object);

只有对象才会有 null 值,所以编译器是不会报错的,只不过,对于 null 来说,instanceof 的结果为 false。因为所有的对象都可以为 null,所以也不好确定 null 到底属于哪一个类。

通常,我们是这样使用 instanceof 操作符的。

代码语言:javascript
复制
// 先判断类型
if (obj instanceof String) {
    // 然后强制转换
    String s = (String) obj;
    // 然后才能使用
}

先用 instanceof 进行类型判断,然后再把 obj 强制转换成我们期望的类型再进行使用。

JDK 16 的时候,instanceof 模式匹配转了正,意味着使用 instanceof 的时候更便捷了。

代码语言:javascript
复制
if (obj instanceof String s) {
    // 如果类型匹配 直接使用 s
}

可以直接在 if 条件判断类型的时候添加一个变量,就不需要再强转和声明新的变量了。

“哇,这样就简洁了呀!”三妹不仅惊叹到!

好了,关于 instanceof 操作符我们就先讲到这吧,难是一点都不难,希望各位同学也能够很好的掌握。

至于下一篇什么时候会写,大家多催催就是了。这周打算把对应的 GitHub 和码云,以及 docsify 都重新更新一波~敬请期待。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 沉默王二 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档