当前位置: 首页 > news >正文

Java中 instanceof 的用法(详解)

目录

引言

基本语法

基本作用

1. 检查对象是否是指定类的实例

2. 检查对象是否是子类的实例

3. 检查对象是否实现某个接口

4.null 处理

错误分析:

5.综合对比示例

最后总结

注意事项


引言


instanceof 概念在多态中引出,因为在多态发生时,子类只能调用父类中的方法(编译时类型的方法),而子类自己独有的方法(运行时类型的方法)无法调用,如果强制调用的话就需要向下转型,语法和基本类型的强制类型转换一样;但是向下转型具有一定的风险,很有可能无法成功转化,为了判断能否成功转化,就需要 instanceof 先进行一个判断,然后再进行转换操作。


在 Java 中,instanceof 是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例。以下是关于 instanceof 的详细介绍:

基本语法

object instanceof Class/Interface
//对象 instanceof 类型(类/接口)

object:要检查的对象引用。可以是一个变量,也可以是一个表达式,其结果是一个对象引用。

Class/Interface:要检查的类或接口的名称。

基本作用

instanceof 运算符返回一个布尔值:

●如果 object 是指定 Class/Interface 的实例,或者是其子类的实例,返回 true。

●如果 object 不是指定 Class/Interface 的实例,返回 false。

●如果 object 为 null,则返回 false。

1. 检查对象是否是指定类的实例

场景:直接判断对象是否为某个具体类的实例。

// 示例类
class Car {}public class Main {public static void main(String[] args) {Car car = new Car();System.out.println(car instanceof Car); // true}
}

运行结果car 是 Car 类的实例,返回 true


2. 检查对象是否是子类的实例

场景:子类对象会被识别为父类的实例(继承关系)。

// 父类
class Animal {}
// 子类
class Dog extends Animal {}public class Main {public static void main(String[] args) {Dog dog = new Dog();System.out.println(dog instanceof Animal); // true}
}

运行结果Dog 是 Animal 的子类,dog 被视为 Animal 的实例。


3. 检查对象是否实现某个接口

场景:判断对象是否实现了特定接口。

// 接口定义
interface Flyable {void fly();
}
// 实现接口的类
class Bird implements Flyable {public void fly() {System.out.println("Bird flying");}
}public class Main {public static void main(String[] args) {Bird bird = new Bird();System.out.println(bird instanceof Flyable); // true}
}

运行结果Bird 实现了 Flyable 接口,返回 true

4.null 处理


null 使用 instanceof 会直接返回 false

String str = null;
System.out.println(str instanceof String); // false(无空指针异常)

运行结果为:

错误分析:

当你遇到 “Condition'str instanceof String' is always 'false'”

条件“str 是 String 类型”总是“假”。

这个提示时,意味着在代码里使用 instanceof 运算符去判断一个变量是否为 String 类型,然而该变量的类型在编译时就已确定,它不可能是 String 类型,所以这个条件永远为 false。

5.综合对比示例

class Fruit {}
class Apple extends Fruit {}
class Banana extends Fruit {}interface Edible {void eat();
}
class RedApple extends Apple implements Edible {public void eat() {System.out.println("Eating red apple");}
}public class Main {public static void main(String[] args) {Object obj1 = new Apple();      // Apple 是 Fruit 的子类Object obj2 = new RedApple();   // RedApple 是 Apple 的子类,且实现了 EdibleObject obj3 = new Banana();     // Banana 是 Fruit 的子类// 检查是否为 Fruit 或其子类的实例System.out.println(obj1 instanceof Fruit);   // true(Apple 是 Fruit 子类)System.out.println(obj2 instanceof Fruit);   // true(RedApple 是 Fruit 子类的子类)System.out.println(obj3 instanceof Fruit);   // true(Banana 是 Fruit 子类)// 检查是否实现了接口System.out.println(obj2 instanceof Edible);  // true(RedApple 实现了 Edible)System.out.println(obj3 instanceof Edible);  // false(Banana 未实现 Edible)}
}

运行结果:


关键结论

(1).子类向上兼容

●子类对象(如 Apple)会被视为父类(如 Fruit)的实例。

●子类的子类(如 RedApple)也会被识别为父类的实例(继承链向上追溯)。

(2).接口实现

●只要类实现了某个接口(如 Edible),无论继承层级多深,instanceof 都会返回 true。

(3).运行时类型判断 instanceof

●检查的是对象在内存中的实际类型(运行时类型),而不是变量声明的类型。

●例如:Object obj = new Apple(); 中,obj instanceof Apple 仍然为 true。

最后总结

instanceof运算符的使用

1.语法格式:(引用 instanceof 类型)

2.执行结果是true或者false

3.例如:(a instanceof Cat)

●如果结果是true:表示a引用指向的对象是Cat类型的。

●如果结果是false:表示a引用指向的对象不是Cat类型的。

注意事项

  • 基本类型无法使用instanceof 只能用于对象,不能用于基本类型(如 int)。

  • 设计警示:过度使用 instanceof 可能暗示设计问题,考虑用多态或策略模式替代。

通过合理使用 instanceof,可以安全处理类型不确定的场景,尤其在泛型、反射和动态逻辑中非常有用。

相关文章:

Java中 instanceof 的用法(详解)

目录 引言 基本语法 基本作用 1. 检查对象是否是指定类的实例 2. 检查对象是否是子类的实例 3. 检查对象是否实现某个接口 4.null 处理 错误分析: 5.综合对比示例 最后总结 注意事项 引言 instanceof 概念在多态中引出,因为在多态发生时&…...

联想拯救者R720笔记本外接显示屏方法,显示屏是2K屏27英寸

晚上23点10分前下单,第二天上午显示屏送到,检查外包装没拆封过。这个屏幕左下方有几个按键,按一按就开屏幕、按一按就关闭屏幕,按一按方便节省时间,也支持阅读等模式。 显示屏是 :AOC 27英寸 2K高清 100Hz…...

【RocketMQ 存储】- 一文总结 RocketMQ 的存储结构-基础

文章目录 1. 前言 本文章基于 RocketMQ 4.9.3 1. 前言 RocketMQ 存储部分系列文章: 【RocketMQ 存储】- RocketMQ存储类 MappedFile 【RocketMQ 存储】- 一文总结 RocketMQ 的存储结构-基础 【RocketMQ 存储】- 一文总结 RocketMQ 的存储结构-基础...

S4 HANA明确税金本币和外币之间转换汇率确定(OBC8)

本文主要介绍在S4 HANA OP中明确明确税金本币和外币之间转换汇率确定(OBC8)相关设置。具体请参照如下内容: 明确税金本币和外币之间转换汇率确定(OBC8) 以上配置,我们可以根据不同公司代码所配置的使用不同的汇率来对税金外币和本币之间进行换算。来针对…...

Cocos Creator 3.8 2D 游戏开发知识点整理

目录 Cocos Creator 3.8 2D 游戏开发知识点整理 1. Cocos Creator 3.8 概述 2. 2D 游戏核心组件 (1) 节点(Node)与组件(Component) (2) 渲染组件 (3) UI 组件 3. 动画系统 (1) 传统帧动画 (2) 动画编辑器 (3) Spine 和 …...

梯度提升用于高效的分类与回归

使用 决策树(Decision Tree) 实现 梯度提升(Gradient Boosting) 主要是模拟 GBDT(Gradient Boosting Decision Trees) 的原理,即: 第一棵树拟合原始数据计算残差(负梯度…...

【单细胞第二节:单细胞示例数据分析-GSE218208】

GSE218208 1.创建Seurat对象 #untar(“GSE218208_RAW.tar”) rm(list ls()) a data.table::fread("GSM6736629_10x-PBMC-1_ds0.1974_CountMatrix.tsv.gz",data.table F) a[1:4,1:4] library(tidyverse) a$alias:gene str_split(a$alias:gene,":",si…...

设计模式 - 行为模式_Template Method Pattern模板方法模式在数据处理中的应用

文章目录 概述1. 核心思想2. 结构3. 示例代码4. 优点5. 缺点6. 适用场景7. 案例:模板方法模式在数据处理中的应用案例背景UML搭建抽象基类 - 数据处理的 “总指挥”子类定制 - 适配不同供应商供应商 A 的数据处理器供应商 B 的数据处理器 在业务代码中整合运用 8. 总…...

新春登蛇山:告别岁月,启航未来

大年初一,晨曦透过薄雾,温柔地洒在武汉的大街小巷。2025 年的蛇年春节,带着新春的喜气与希望悄然而至。我站在蛇山脚下,心中涌动着复杂的情感,因为今天,我不仅将与家人一起登山揽胜,更将在这一天…...

hive:基本数据类型,关于表和列语法

基本数据类型 Hive 的数据类型分为基本数据类型和复杂数据类型 加粗的是常用数据类型 BOOLEAN出现ture和false外的其他值会变成NULL值 没有number,decimal类似number 如果输入的数据不符合数据类型, 映射时会变成NULL, 但是数据本身并没有被修改 创建表 创建表的本质其实就是在…...

安装最小化的CentOS7后,执行yum命令报错Could not resolve host mirrorlist.centos.org; 未知的错误

文章目录 安装最小化的CentOS7后,执行yum命令报错"Could not resolve host: mirrorlist.centos.org; 未知的错误"错误解决方案: 安装最小化的CentOS7后,执行yum命令报错"Could not resolve host: mirrorlist.centos.org; 未知…...

图论——spfa判负环

负环 图 G G G中存在一个回路,该回路边权之和为负数,称之为负环。 spfa求负环 方法1:统计每个点入队次数, 如果某个点入队n次, 说明存在负环。 证明:一个点入队n次,即被更新了n次。一个点每次被更新时所对应最短路的边数一定是…...

软件工程概论试题三

一、单选 1.需求确认主要检査五个方面的内容,其中那一项是为了保证文档中的需求不互相冲突(即不应该有相互矛盾的约束或者对同一个系统功能有不同的描述)。 A.现实性 B. 可验证性 C.一致性 D.正确性 E.完整性 正答:C 2.下列开发方法中,( )不…...

21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)

21.3-启动流程、编码风格(了解) 启动流程 第一种启动流程(我们就使用这个): 在main函数中将硬件初始化、RTOS系统初始化,同时创建所有任务,再启动RTOS调度器。 第二种启动流程: 在main函数中将硬件初始化、RTOS系统初始化,只…...

未来无线技术的发展方向

未来无线技术的发展趋势呈现出多样化、融合化的特点,涵盖速度、覆盖范围、应用领域、频段利用、安全性等多个方面。这些趋势将深刻改变人们的生活和社会的运行方式。 传输速度提升:Wi-Fi 技术迭代加快,如 Wi-Fi7 理论峰值速率达 46Gbps&#…...

Qt5离线安装包无法下载问题解决办法

想在电脑里装一个Qt,但是直接报错。果然还是有解决办法滴。 qt download from your ip is not allowed Qt5安装包下载办法 方法一:简单直接,直接科学一下,不过违法行为咱不做,遵纪守法好公民(不过没办法阻…...

qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别

qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别 code review! 参考笔记 1.qt-C笔记之重写QGraphicsItem的paint方法(自定义QGraphicsItem) 文章目录 qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphic…...

doris:导入时实现数据转换

Doris 在数据导入时提供了强大的数据转换能力,可以简化部分数据处理流程,减少对额外 ETL 工具的依赖。主要支持以下四种转换方式: 列映射:将源数据列映射到目标表的不同列。 列变换:使用函数和表达式对源数据进行实时…...

新版231普通阿里滑块 自动化和逆向实现 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向过程 补环境逆向 部分补环境 …...

如何构建树状的思维棱镜认知框架

在思维与知识管理中,“树状思维棱镜”通常指一种层级式、可多维度展开和不断深入(下钻)的认知框架。它不仅仅是普通的树状结构(如传统思维导图),更强调“棱镜”所体现的多视角、多维度切换与综合分析的能力…...

数据库智能运维:利用PyTorch LSTM预测数据库性能瓶颈

数据库智能运维:利用PyTorch LSTM预测数据库性能瓶颈 1. 引言:当数据库遇上AI预测 凌晨三点,运维工程师小李被刺耳的报警声惊醒——核心数据库又崩溃了。这已经是本月第三次因为性能瓶颈导致的业务中断,每次损失都超过百万。传统…...

React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染

React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染 【免费下载链接】react-native-chart-kit 📊React Native Chart Kit: Line Chart, Bezier Line Chart, Progress Ring, Bar chart, Pie chart, Contribution graph (heatmap) 项目地址:…...

实战应用:使用快马平台为vmware17部署生成企业级健康检查与配置方案

在实际的企业IT环境中,部署VMware vSphere 17(以下简称VMware 17)这类虚拟化平台往往不是简单的安装过程,而是需要综合考虑硬件兼容性、系统配置、安全策略等多方面因素。为了确保部署过程的顺利和后续运行的稳定,我们…...

网站SEO优化与网站内容更新的关系_企业网站SEO优化与行业特点的关系

<h3 id"seo_seo">网站SEO优化与网站内容更新的关系_企业网站SEO优化与行业特点的关系</h3> <p>在当今数字化时代&#xff0c;网站的SEO优化与内容更新之间有着密切的关系。这不仅关系到企业网站的流量&#xff0c;还直接影响企业的品牌形象和市场竞…...

从原理到实战:位运算巧解最小码距(附完整代码)

1. 什么是码距&#xff1f;从生活场景理解概念 第一次听到"码距"这个词时&#xff0c;我脑海里浮现的是超市货架上相似商品间的距离。后来才发现&#xff0c;在计算机世界里&#xff0c;它描述的是两个编码之间的差异程度。举个生活中的例子&#xff1a;假设我们用5…...

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包)

从“Hello World”到区域赛银牌&#xff1a;我的ACM算法打怪升级全记录 记得大一刚接触编程时&#xff0c;连最简单的冒泡排序都要调试半天。三年后站在领奖台上&#xff0c;回想这段旅程&#xff0c;最珍贵的不是奖牌&#xff0c;而是那些深夜debug的坚持和突破自我的瞬间。这…...

Vivado MIG IP核实战:DDR3控制器配置与仿真全流程解析

1. Vivado MIG IP核与DDR3控制器基础认知 第一次接触DDR3控制器时&#xff0c;我被那些密密麻麻的时序图吓得不轻。直到发现Xilinx的MIG&#xff08;Memory Interface Generator&#xff09;IP核&#xff0c;才明白原来FPGA开发可以这么"偷懒"。这个IP核就像个贴心的…...

不只是安装:深入理解TI毫米波雷达开发套件(MMWCAS-RF-EVM)的软件生态与数据流

不只是安装&#xff1a;深入理解TI毫米波雷达开发套件&#xff08;MMWCAS-RF-EVM&#xff09;的软件生态与数据流 毫米波雷达技术正在重塑自动驾驶、工业检测和智能安防等领域&#xff0c;而TI的MMWCAS-RF-EVM评估板作为行业标杆工具&#xff0c;其真正的价值往往被简化为"…...

5分钟学会用AI将手绘草图转为专业科研图表代码

5分钟学会用AI将手绘草图转为专业科研图表代码 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 你是否曾因绘制科研图表而烦恼&#xff1f;面对复杂…...

如何3分钟制作专业证件照?HivisionIDPhotos免费AI工具全攻略

如何3分钟制作专业证件照&#xff1f;HivisionIDPhotos免费AI工具全攻略 【免费下载链接】HivisionIDPhotos ⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。 项目地址: https://gitcode.com/GitHub_Trending/hiv/Hi…...