两千字讲明白java中instanceof关键字的使用!

news2024/11/18 12:16:56

写在开头

在过往的内容中,我们讲了不少的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
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享wifi项目到底能不能做?

如今,互联网已经渗透到我们生活的方方面面,人们对WiFi的需求越来越大,已经成为人们不可或缺的一部分。在这样的背景下,共享WiFi项目应运而生,作为近年来兴起的创业选择,成为了越来越多创业者追逐的热门项目…

5分钟做自己的微信红包封面

文章目录 怎么制作自己的红包封面?开通红包封面的要求如下:收费情况制作具体网站:https://chatapi.onechat.fun/register?affYoU6 提交审核logo封面、挂件、气泡证明材料 发放红包封面其他 怎么制作自己的红包封面? 开通红包封面…

秒级弹性!探索弹性调度与虚拟节点如何迅速响应瞬时算力需求?

作者:吴昆 前言 在前面的文章《弹性调度助力企业灵活应对业务变化,高效管理云上资源》中,我们介绍了阿里云容器服务 ACK 弹性调度为了帮助客户解决在使用云上弹性资源时,面对的“难以差异化控制业务资源使用量,缩容时…

C语言第七弹---循环语句

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 循环语句 1、while循环1.1、if和while的对比1.2、while语句的执行流程1.3、while循环的实践1.4、练习 2、for循环2.1、语法形式2.2、for循环的执行流程2.3、for循…

架构篇16:高性能NoSQL

文章目录 K-V 存储文档数据库列式数据库全文搜索引擎小结关系数据库经过几十年的发展后已经非常成熟,强大的 SQL 功能和 ACID 的属性,使得关系数据库广泛应用于各式各样的系统中,但这并不意味着关系数据库是完美的,关系数据库存在如下缺点。 关系数据库存储的是行记录,无法…

使用Java编写RESTful Web服务

RESTful Web服务是一种基于HTTP协议的软件架构风格,它使用不同的HTTP方法(如GET、POST、PUT、DELETE等)来执行不同的操作,并使用统一的接口来访问和操作资源。在Java中,有多种框架可用于编写RESTful Web服务&#xff0…

Typecho后台无法登录显示503 service unavailable问题及处理

一、Typecho 我的博客地址:https://www.aomanhao.top 使用老薛主机动态Typecho博客框架handsome主题的搭配,文章内容可以异地网页更新,可以听后台背景音乐,很好的满足我的痛点需求,博客部署在云端服务器访问响应较快…

阿里云4核8G云服务器价格、带宽及系统盘费用

阿里云服务器4核8g配置云服务器u1价格是955.58元一年,4核8G配置还可以选择ECS计算型c7实例、计算型c8i实例、计算平衡增强型c6e、ECS经济型e实例、AMD计算型c8a等机型等ECS实例规格,规格不同性能不同,价格也不同,阿里云服务器网al…

Steam幻兽帕鲁搭建教程,如何选择服务器

如何选购服务器 大家可以根据自己的需求选购,大家最好选用物理服务器,可以找我参考一下。1到6人建议使用16H32G的20带宽的。12人以上建议大家使用E5的CPU内存64G的带宽50起步的。大家在选择服务器商的时候一定要选择正规的拥有资质的,这样售…

RabbitMQ系列之交换机的使用

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《RabbitMQ系列之交换机的使用》。🎯&…

ntp时间适配服务器和ssh免密登录

1.配置ntp时间服务器,确保客户端主机能和服务主机同步时间 服务端server向阿里时间服务器进行时间同步 第一步:定位服务端server #安装软件 [rootserver ~]# yum install chrony -y # 编辑配置文件,定位第3行,修改…

Win10添加网络打印机后无法打印的解决方法

在Win10电脑中,用户成功添加了网络打印机,却遇到了无法打印的问题,导致用户不能顺利完成打印任务。以下小编分享三种简单的方法,帮助大家轻松解决Win10网络打印机已添加但无法打印的问题,解决后用户就能通过网络打印机…

【AI大模型】WikiChat超越GPT-4:在模拟对话中事实准确率提升55%终极秘密

WikiChat,这个名字仿佛蕴含了无尽的智慧和奥秘。它不仅是一个基于人工智能和自然语言处理技术的聊天机器人,更是一个能够与用户进行深度交流的智能伙伴。它的五个突出特点:高度准确、减少幻觉、对话性强、适应性强和高效性能,使得…

pnpm 源不对 Will retry in 10 seconds. 2 retries left.

现象 由于使用npm config set registry 切换淘宝源时,把地址打错了。 后面使用pnpm install 时出现 此时无论我怎么使用npm config set registry 或者pnpm config set registry 切回正确的源均没有效果。 解决 在其他用npm的项目运行一下npm i 再运行pnpm i 即…

生产问题(十四)K8S抢占CPU导致数据库链接池打爆

一、引言 线上一天出现了两次数据库连接失败的大量报错,一开始以为是数据库的问题,但是想了想如果是数据库的问题,应该会有大量的应用问题 具体分析之后,发现其实是容器cpu出现了Throttled,导致大量线程阻塞 二、分析 …

UDS Flash刷写流程介绍

一、刷写流程介绍 1.1刷写包含以下三个步骤:预编程,编程,后编程 1.2预编程步骤 此步骤是保证能够正常进入编程(10 02)会话下。 (1)如果无特殊要求,只保证刷写能够正常进行&#x…

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别:都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …

嵌入式-stm32-江科大-EXTI外部中断

一:EXTI外部中断(external interrupt) 1.1 STM32 中断系统 中断是指在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前的程序,转而去处理中断程序,…

菜鸟初进stable diffusion

不知道是不是玩novelai被boss看到了,推荐了我学stable diffusion 扩散模型 DALL E Midjourney stable diffusion latent diffusion 说是改进点在于“给输入图片压缩降低维度,所以有个latent,从而减少计算量”,类似于下采样吧&…

消息队列RabbitMQ.01.安装部署与基本使用

目录 RabbitMQ的作用 Message queue 释义 问题思考 存在的问题 优化方案 案例分析 带来的好处 消息队列特点 Email邮件案例分析 Docker安装部署RabbitMQ 1.下拉镜像 2.运行RabbitMQ 3.打开防火墙端口号并重新运行防火墙 4.容器启动后,可以通过 docker logs 容器 查…