两千字讲明白java中instanceof关键字的使用!
写在开头
在过往的内容中,我们讲了不少的Java关键字,比如final、static、this、super等等,Java中的关键字非常之多,下图是整理的关键字集合

而我们今天要学习的就是其中的instanceof关键字!
instanceof的定义
instanceof 运算符是用来在运行时判断对象是否是指定类及其父类的一个实例(包括接口),因为比较的是对象,故不能应用于基本数据类型中!
其基本语法:
(object) instanceof (type)
咱们直接上一段代码,感受一下instanceof的魅力吧
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
System.out.println(d instanceof Animal);
}
}
class Animal {
public void method1(){};
}
class Dog extends Animal{
}
输出:
true
这段代码满足“对象是否是指定类及其父类的一个实例”,所以才返回true。其实,这里面也涉及到Java中的is-a关系,在这里做一下小小的知识延伸吧
is-a、has-a、is-like-a
在Java中类与类之间存在继承与被继承关系,类与接口之间存在着实现与被实现关系,这些关系之间用了is-a、has-a、is-like-a来贴切的形容。
is-a
所谓is-a就子类属于唯一一个父类,因为Java是单继承
public class Animal{
public void method1(){};
}
public class Dog extends Animal{ // Dog is a Animal
}
has-a
所谓has-a就是前者拥有后者
public class A{ // A has a B
private B b;
}
public class B{
}
is-like-a
所谓is-like-a就是类实现接口的过程,类之所以能实现接口,是因为这个类会拥有接口抽象的某种行为,也就代表着他们之间存在着相似之处。
public interface I{
public void method1();
}
public class A implements I{ // A is like a I
public void method1(){
}
}
那么这时候,我们应该有这样一个思考:“在instanceof的定义中的那段代码,是证明了一个类对象属于它或者它父类的实例,那么如果一个类实现了一个接口,那么用instanceof去判断会返回true or false呢?”,带着疑问,我们来看如下这段代码:
public class Test {
public static void main(String[] args) {
Dog d = new Dog();
System.out.println(d instanceof Animal);
System.out.println(d instanceof Active);
//反例,输出为false
System.out.println(d instanceof Other);
}
}
class Animal {
public void method1(){};
}
class Dog extends Animal implements Active{
@Override
public void run() {
System.out.println("小狗子爱奔跑");
}
}
interface Active{
void run();
}
interface Other{
void method();
}
输出:
true
true
false
由此可见,在接口中同样适用,所以赶紧回去把开头的话加上一个“(包括接口)”去,自我怀疑,自我验证,自我修改,成功闭环,哈哈哈!
instanceof的用法
了解了instanceof之后,我们应该渴望知道它的具体用法!通常,我们是这样使用 instanceof 操作符的。小二,上代码!
//JDK8中
// 先判断类型
if (obj instanceof String) {
// 然后强制转换
String s = (String) obj;
// 然后才能使用
}
上面的代码中我们可以看到,我们可以通过instanceof判断后进行类型强转,从而满足我们想使用的类型,常用在反序列化中,避免因为类型转换错误带来ClassCastException 异常。
如上的写法在JDK16中迎来的优化,通过在 if 条件判断类型的时候添加一个变量,省略了强转和声明新的变量,简洁高效!
JDK16
if (obj instanceof String s) {
// 如果类型匹配 直接使用 s
}
两千字讲明白java中instanceof关键字的使用!的更多相关文章
- Java中instanceof关键字的理解
java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...
- Java中instanceof关键字的用法
Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. instanc ...
- JAVA中INSTANCEOF关键字的用法总结
https://www.cnblogs.com/jay36/p/7519145.html https://www.cnblogs.com/zjxynq/p/5882756.html https://b ...
- java中instanceof和getClass()的作用
初学者难免有点混淆java中instanceof和getClass()的作用, 下面就来一一讲解. 父类A: class A { } 子类B: class B extends A { } 构造对象 ...
- Java中instanceof和isInstance的具体区别
Java中instanceof和isInstance的具体区别 在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考 ...
- Java中异常关键字throw和throws使用方式的理解
Java中应用程序在非正常的情况下停止运行主要包含两种方式: Error 和 Exception ,像我们熟知的 OutOfMemoryError 和 IndexOutOfBoundsExceptio ...
- Java 中的关键字
Java 中有多少个关键字,有大小写之分吗? Java 中有 48 个关键字在使用 + 两个保留关键字未使用,共 50 个关键字. Java 关键字全部都由是小写组成. Java 中保留关键字分别是哪 ...
- 【转】java中volatile关键字的含义
java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
- Java中this关键字的使用
本文介绍了在Java中this关键字的作用于使用方法 当局部变量和成员变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量.(this指的是当前对象自己) 如:public class ...
- 转:java中volatile关键字的含义
转:java中volatile关键字的含义 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言 ...
随机推荐
- 揭开KPI异常检测顶级AI模型面纱
摘要:2020GDE全球开发者大赛-KPI异常检测告一段落,来自深圳福田莲花街道的"原子弹从入门到精通"有幸取得了总榜TOP1的成绩,在这里跟大家分享深圳福田莲花街道在本次比赛的解 ...
- 云小课|RDS实例连接又失败?看我祭出杀手锏!
摘要:自从购买了RDS实例,连接失败的问题就伴随着我,我真是太难了.不要害怕,不要着急,跟着小云妹,读了本文,让你风里雨里,实例连接自此畅通无阻! 顺着以下几个方面进行排查,问题就可以迎刃而解~ 本文 ...
- 云图说|初识数据库和应用迁移UGO
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:数据库和应用迁移 ...
- Gartner 权威解读: SBOM 采用率将于2025年达到60%
随着现代软件开发越来越依赖于第三方资源,针对软件供应链的恶意攻击数量也随之激增.据业内权威机构 Gartner 预计,软件物料清单 (SBOM) 的采用率在 2025 年将会达到 60%. Gartn ...
- 火山引擎在行为分析场景下的ClickHouse JOIN优化
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 背景 火山引擎增长分析DataFinder基于ClickHouse来进行行为日志的分析,ClickHouse的主要 ...
- Kubernetes(K8S) Pod 介绍
Pod 是 k8s 系统中可以创建和管理的最小单元, 是资源对象模型中由用户创建或部署的最小资源对象模型, 也是在 k8s 上运行容器化应用的资源对象, 其他的资源对象都是用来支撑或者扩展 Pod 对 ...
- Docker SpringBoot Skywalking 8.1 agent
下载源码包:https://archive.apache.org/dist/skywalking/8.1.0/ -- 创建存放目录 mkdir -p /opt/skywalking -- 进入目录 c ...
- 多图预警,DreamBooth 微调黑客松结果发布啦!
去年 12 月底,我们面向全球的开发者举办了 DreamBooth 编程马拉松活动.通过 DreamBooth,你可以使用少量的图像对文生图模型进行微调,将你「喂给」模型的图片信息进行命名,就可以通过 ...
- AcWing 第 3 场周赛
比赛链接:Here AcWing 3660. 最短时间 比较四个方向和 \((r,c)\) 的距离 void solve() { ll n, m, r, c; cin >> n >& ...
- 打造绿色城市,数字孪生天然气站 3D 可视化
前言 天然气作为常见的燃料,与我们的生活息息相关,而对于这种燃料的存储与传输,对于天然气供应站有着严格的要求.燃气企业一般都会将点供站设计为无人值守站,而往往在运营管理过程中,对点供站的安全管理尤为重 ...