Java学习教程,从入门到精通,Java instanceof 关键字语法知识点及案例代码(27)

1、Java instanceof 关键字语法知识点及案例代码

Java instanceof 关键字语法知识点

instanceof 是 Java 中的一个关键字,用于测试一个对象是否是一个特定类的实例,或者是这个类的子类的实例。它返回一个布尔值,常用于类型检查和类型转换之前,以避免 ClassCastException

语法格式

result = object instanceof className;
  • object:要进行类型检查的对象。
  • className:要检查的类名或接口名。
  • result:返回一个布尔值,如果 objectclassName 类的实例或其子类的实例,则返回 true,否则返回 false

注意事项

  1. instanceof 运算符只适用于对象类型,不适用于原始数据类型(如 intdouble 等)。
  2. instanceof 运算符用于在运行时判断对象的类型,因此通常比较耗时,应尽量避免频繁使用。
  3. nullinstanceof 跟任何类型比较时,总是返回 false
  4. instanceof 运算符不能用于确定一个对象是否是某个类的子类,但它可以用于检查一个对象是否实现了某个接口。
案例代码

案例1:基本用法

class Animal {void makeSound() {System.out.println("Some sound");}
}class Dog extends Animal {void bark() {System.out.println("Woof");}
}public class InstanceOfExample {public static void main(String[] args) {Animal myAnimal = new Dog();if (myAnimal instanceof Dog) {Dog myDog = (Dog) myAnimal;myDog.bark();}}
}

在这个例子中,myAnimalDog 的一个实例。在将 myAnimal 转换为 Dog 类型之前,使用 instanceof 检查它是否是 Dog 的实例。

案例2:多态和处理不同类型的对象

class Shape {void draw() {System.out.println("Drawing a shape");}
}class Circle extends Shape {void draw() {System.out.println("Drawing a circle");}
}
class Square extends Shape {void draw() {System.out.println("Drawing a square");}
}public class InstanceOfExample2 {public static void main(String[] args) {Shape[] shapes = {new Circle(), new Square(), new Shape()};for (Shape shape : shapes) {if (shape instanceof Circle) {((Circle) shape).draw();} else if (shape instanceof Square) {((Square) shape).draw();} else {shape.draw();}}}
}

在这个例子中,shapes 数组包含不同类型的 Shape 对象。在遍历数组时,使用 instanceof 关键字来检查每个对象的类型,并调用相应的 draw 方法。
案例3:避免冗余检查和处理null

class Person {}
class Teacher extends Person {}
class Student extends Person {}public class Test01 {public static void main(String[] args) {Object obj = new Student();System.out.println(obj instanceof Student); // trueSystem.out.println(obj instanceof Person);  // trueSystem.out.println(obj instanceof Object);  // trueSystem.out.println(obj instanceof String);  // falseSystem.out.println(obj instanceof Teacher); // falsePerson person = new Student();System.out.println(person instanceof Person); // trueSystem.out.println(person instanceof Object); // true// System.out.println(person instanceof String); // 编译错误System.out.println(person instanceof Teacher); // falseString str = null;if (str instanceof String) {System.out.println("This is a string");} else {System.out.println("This is not a string"); // 输出 "This is not a string"}}
}

在这个例子中,instanceof 检查了对象是否是某个类的实例,并且展示了如何处理 null 值。
案例4:接口检查

interface Flyable {}
class Bird implements Flyable {}public class InstanceOfExample3 {public static void main(String[] args) {Bird bird = new Bird();if (bird instanceof Flyable) {System.out.println("Bird can fly");}}
}

在这个例子中,instanceof 用于检查一个对象是否实现了某个接口。
通过以上案例,我们可以看到 instanceof 在 Java 中的广泛应用,特别是在处理多态、类型检查和类型转换时。它可以帮助确保代码的类型安全,避免在运行时发生类型转换异常。
以下是对Java中instanceof关键字细节的进一步补充:

一、instanceof的工作原理

在Java中,每个对象都有一个运行时类型标识(runtime type identification),这个标识由Java虚拟机在对象创建时自动添加,并保存在对象头中。当使用instanceof运算符对对象进行判断时,实际上是通过比较该对象的运行时类型标识和指定类的类型来确定对象是否是指定类的实例。Java虚拟机在运行时会自动维护一个类型层次结构(type hierarchy),包括类和接口之间的继承关系。当使用instanceof运算符判断一个对象是否是某个类的实例时,Java虚拟机会沿着类型层次结构向上查找,直到找到该对象的类或直接或间接继承自指定类的子类为止。如果找到了该类,则返回true,否则返回false

二、instanceof的注意事项

  1. 避免冗余检查:如果编译器已经知道对象的类型,instanceof检查是多余的。例如,对于已知是String类型的对象,进行instanceof String的检查是不必要的。
  2. 处理null:对于null值,instanceof运算符总是返回false。因为null没有类型信息,它不能被视为任何类的实例。
  3. 类型层次结构检查instanceof运算符检查的是对象的类型层次结构,包括类的继承和接口的实现。因此,如果一个对象实现了某个接口,那么使用instanceof运算符可以检查该对象是否是该接口的实例。
  4. 性能考虑:虽然instanceof运算符在大多数情况下是高效的,但在某些性能敏感的场景下,频繁使用instanceof可能会导致性能下降。因此,在可能的情况下,应尽量避免频繁使用instanceof运算符。

三、instanceof的应用场景

  1. 类型转换:在使用强制类型转换之前,可以使用instanceof运算符检查对象的类型,以避免ClassCastException异常的发生。例如,将一个对象转换为String类型之前,可以使用instanceof运算符检查该对象是否是String类型的实例。
  2. 运行时类型判断:在某些情况下,需要在运行时根据对象的类型执行不同的代码逻辑。这时可以使用instanceof运算符来判断对象的类型,并根据类型执行相应的操作。例如,在处理一个包含不同类型对象的集合时,可以使用instanceof运算符来遍历集合中的每个对象,并根据对象的类型执行不同的操作。
  3. 对象匹配:在集合或数组中包含不同类型的对象时,可以使用instanceof进行类型检查和处理。例如,在一个包含多种类型对象的列表中查找特定类型的对象时,可以使用instanceof运算符来筛选符合条件的对象。

四、示例代码

以下是一个包含多个instanceof使用场景的示例代码:

class Animal {void makeSound() {System.out.println("Animal sound");}
}
class Dog extends Animal {void bark() {System.out.println("Woof");}
}class Cat extends Animal {void meow() {System.out.println("Meow");}
}
interface Flyable {void fly();
}class Bird implements Flyable {public void fly() {System.out.println("Bird flying");}
}
public class InstanceOfExample {public static void main(String[] args) {// 类型转换Animal myAnimal = new Dog();if (myAnimal instanceof Dog) {Dog myDog = (Dog) myAnimal;myDog.bark();}// 运行时类型判断Animal[] animals = {new Dog(), new Cat(), new Animal()};for (Animal animal : animals) {if (animal instanceof Dog) {((Dog) animal).bark();} else if (animal instanceof Cat) {((Cat) animal).meow();} else {animal.makeSound();}}// 对象匹配Object[] objects = {new Bird(), new Integer(10), new String("Hello")};for (Object obj : objects) {if (obj instanceof Flyable) {((Flyable) obj).fly();} else if (obj instanceof String) {System.out.println("Found a string: " + obj);} else if (obj instanceof Integer) {System.out.println("Found an integer: " + obj);} else {System.out.println("Unknown type: " + obj.getClass().getName());}}// 处理null值Animal nullAnimal = null;if (!(nullAnimal instanceof Animal)) {System.out.println("nullAnimal is not an instance of Animal");}}
}

在这个示例中,我们展示了instanceof运算符在类型转换、运行时类型判断、对象匹配以及处理null值等方面的应用。通过这些示例,我们可以更好地理解instanceof运算符在Java编程中的实际用法和重要性。

当然可以。以下是一个使用instanceof运算符的简单Java示例:

class Animal {void makeSound() {System.out.println("Some generic animal sound");}
}class Dog extends Animal {void bark() {System.out.println("Woof woof");}
}class Cat extends Animal {void meow() {System.out.println("Meow meow");}
}
public class InstanceOfDemo {public static void main(String[] args) {Animal myDog = new Dog(); // 向上转型Animal myCat = new Cat(); // 向上转型// 使用instanceof运算符检查对象类型if (myDog instanceof Dog) {System.out.println("myDog is an instance of Dog");// 向下转型并调用Dog类的方法((Dog) myDog).bark();}if (myCat instanceof Cat) {System.out.println("myCat is an instance of Cat");// 向下转型并调用Cat类的方法((Cat) myCat).meow();}// 检查一个对象是否不是某个类型的实例if (!(myDog instanceof Cat)) {System.out.println("myDog is not an instance of Cat");}// 处理null值Animal nullAnimal = null;if (nullAnimal == null || !(nullAnimal instanceof Animal)) {System.out.println("nullAnimal is either null or not an instance of Animal");}}
}

在这个示例中,我们定义了一个基类Animal和两个子类DogCat。在main方法中,我们创建了DogCat的实例,并将它们向上转型为Animal类型。然后,我们使用instanceof运算符来检查这些对象的实际类型,并根据类型执行相应的操作。
输出结果将是:

myDog is an instance of Dog
Woof woof
myCat is an instance of Cat
Meow meow
myDog is not an instance of Cat
nullAnimal is either null or not an instance of Animal

这个示例展示了instanceof运算符在运行时检查对象类型的能力,以及如何在确认类型后进行安全的向下转型和调用子类特有的方法。同时,也展示了如何处理null值的情况。

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

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

相关文章

软件测试之白盒测试(超详细总结)

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 白盒测试 白盒测试(White Box Testing)又称结构测试、透明盒测试、逻辑驱动测试或基于代码的测试。白盒测试只测试软件产品的内部结…

【入门篇】数字统计——多语言版

题目跳转:数字统计 题目解析: 这道题目要求统计在给定范围 [L, R] 内所有整数中数字 2 出现的次数。例如,在范围 [2, 22] 中,数字 2 分别在数 2、12、20、21、22 中出现的次数,最终出现了6次。 题目的输入为两个正…

C++初阶——list

一、什么是list list是一个可以在序列的任意位置进行插入和删除的容器,并且可以进行双向迭代。list的底层是一个双向链表,双向链表可以将它们包含的每个元素存储在不同且不相关的存储位置。通过将每个元素与前一个元素的链接和后一个元素的链接关联起来&…

FlinkSql读取kafka数据流的方法(scala)

我的scala版本为2.12 <scala.binary.version>2.12</scala.binary.version> 我的Flink版本为1.13.6 <flink.version>1.13.6</flink.version> FlinkSql读取kafka数据流需要如下依赖&#xff1a; <dependency><groupId>org.apache.flink&…

力扣 LeetCode 19. 删除链表的倒数第N个结点(Day2:链表)

解题思路&#xff1a; 快慢指针 class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {ListNode dummy new ListNode(-1);dummy.next head;ListNode fast dummy;ListNode slow dummy;for (int i 0; i < n; i) {fast fast.next;}while (fast.ne…

提升法律文书处理效率的秘密武器:开源文档比对工具解析

本篇文章介绍了一款针对律师行业的免费开源文档比对工具&#xff0c;旨在解决法律文档的多版本比对难题。通过逐字、逐句精确比对、语义分析、批量处理等核心功能&#xff0c;该工具可高效识别文本差异&#xff0c;提升文书审查效率并降低错误风险。它支持多种文件格式&#xf…

linux命令详解,openssl+历史命令详解

openssl openssl是一个开源的加密工具包&#xff0c;提供了各种加密、解密、签名、验证等功能 openssl passwd -1 123password表示这个命令用于处理密码相关的操作&#xff0c;-1参数指定使用MD5加密算法对密码“123”进行加密处理。MD5是一种常用的哈希算法&#xff0c;它将…

轻松理解操作系统 - Linux的虚拟文件系统是如何简化我们的使用的?

在前面几期&#xff0c;我们不仅了解了 Linux文件系统 是如何在硬盘等储存介质上保存文件的&#xff1a; 什么是软硬链接 文件的“身份证” - inode 真正储存文件的地方 - 数据块 文件系统的心脏 - 超级块 以及了解了 Linux系统 中具体都有一些什么文件&#xff1a; Linu…

LeetCode【0019】删除链表的倒数第N个结点

本文目录 1 中文题目2 求解方法&#xff1a;虚拟头节点和快慢指针2.1 方法思路2.2 Python代码2.3 复杂度分析 3 题目总结 1 中文题目 给定一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例&#xff1a; 链表如上&#xff1a; 输入&a…

【JavaSE】多线程案例---阻塞队列

1. 阻塞队列 阻塞队列是一种特殊的队列&#xff0c;也遵守 " 先进先出 " 的原则。 阻塞队列是一种线程安全的数据结构&#xff0c;并且具有以下特性&#xff1a; 1. 当队列为满时&#xff0c;继续进行入队列操作就会阻塞&#xff0c;直到有其他线程从队列中取走元素…

SQL练习(2)

题源&#xff1a;牛客官网 选择题 假设创建新用户nkw&#xff0c;现在想对于任何IP的连接&#xff0c;仅拥有user数据库里面的select和insert权限&#xff0c;则列表语句中能够实现这一要求的语句是&#xff08;&#xff09; A grant select ,insert on *.* to nkw% B grant…

Hyper-v中ubuntu与windows文件共享

Hyper-v中ubuntu与windows文件共享 前言相关链接第一步--第一个链接第二步--第二个链接测试与验证 前言 关于Hyper-V的共享我搞了好久&#xff0c;网上的很多教程太过冗余&#xff0c;我直接采用最简单的办法吧 相关链接 Hyper-V中Ubuntu 同windows系统共享文件夹-百度经验 …

【TCP零窗口问题】

零窗口问题说明 零窗口问题(Zero Window Problem)是指在TCP连接中,当接收方的接收缓冲区已满时,无法接受新的数据。此时,接收方会向发送方发送一个窗口大小为0的TCP消息,告知其暂停发送数据,直到接收方释放出缓冲区空间。这种情况在高负载或接收方处理能力不足时比较常见…

Oracle OCP认证考试考点详解082系列19

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 91. 第91题&#xff1a; 题目 解析及答案&#xff1a; 关于 Oracle 数据库中的索引及其管理&#xff0c;以下哪三个陈述是正确的&#x…

2445.学习周刊-2024年45周

一片树叶展示了秋天的美 ✍优秀博文 数据仓库如何划分主题域在忙碌的工作中如何保持信息的输入&#xff1f;PC小米妙享安装解锁流转补丁智能数据建设与治理Dataphin对方讲话不要乱插嘴轩师处世之道 ✍实用工具 typing-practice云搭 自动化巡检系统 ✍精彩言论 话说的越快、…

关于解决使用VMWare内的虚拟机无法识别USB问题小结

目录 前言 0. 查看是不是没有开启USB3.0的支持 1. 检查一下是否禁用了VMWare USB服务 2. 无奈之举 前言 笔者今天帮助一位同志解决了VMWare内的虚拟机不识别挂载设备的办法。这里对笔者使用的排查手段做一个总结。 0. 查看是不是没有开启USB3.0的支持 我们的第一件事情就…

【364】基于springboot的高校科研信息管理系统

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

RN codegen编译报错

react-native codegen 编译报错 error: redefinition of ‘NativeAccessibilityInfoSpecJSI’ class JSI_EXPORT NativeAccessibilityInfoSpecJSI : public JavaTurboModule 解决&#xff1a; codegen不能和项目本身一起编译&#xff0c;先执行./gradlew clean&#xff0c;然…

大数据技术之Hadoop :我是恁爹

就如上图中的技术分类&#xff0c;大数据技术主要解决的就是海量数据的存储和计算问题。 这两个问题的解决方案最先被 Google 被提出&#xff0c;用于解决 Google 搜索引擎海量的网页存储和索引的构建。对应的技术就是日后被人所熟知的 HDFS 和 MapReduce。 不关注大数据的可…

ATAT-mcsqs生成准随机结构(SQS)更新

通常使用第一性原理计算某些多元素占据原胞中同一位置的结构会优先考虑使用准随机结构&#xff08;special quasirandom structure&#xff0c;SQS&#xff09;来进行模拟建模。此篇教程意在整理一个较为简便的操作流程&#xff0c;以供参考。 合金理论自动化工具包(ATAT)1是一…