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

news2024/11/14 9:19:58

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); // true
        System.out.println(obj instanceof Person);  // true
        System.out.println(obj instanceof Object);  // true
        System.out.println(obj instanceof String);  // false
        System.out.println(obj instanceof Teacher); // false

        Person person = new Student();
        System.out.println(person instanceof Person); // true
        System.out.println(person instanceof Object); // true
        // System.out.println(person instanceof String); // 编译错误
        System.out.println(person instanceof Teacher); // false
        String 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.coloradmin.cn/o/2238965.html

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

相关文章

Ansys Zemax | 手机镜头设计 - 第 4 部分:用LS-DYNA进行冲击性能分析

该系列文章将讨论智能手机镜头模组设计的挑战,从概念和设计到制造和结构变形分析。本文是四部分系列中的第四部分,它涵盖了相机镜头的显式动态模拟,以及对光学性能的影响。使用Ansys Mechanical和LS-DYNA对相机在地板上的一系列冲击和弹跳过程…

【JavaEE初阶】多线程上部

文章目录 本篇目标:一、认识线程(Thread)1.概念:2.创建线程 二、Thread 类及常见方法2.1 Thread 的常见构造方法2.2 Thread 的几个常见属性2.3 启动⼀个线程 - start()2.4 中断⼀个线程2.5 等待⼀个线程 - join()2.6 获取当前线程…

丹摩征文活动|智谱AI引领是实现文本可视化 - CogVideoX-2b 部署与使用

文章目录 前言一、DAMODEL平台特性二、创建CPU云实例三、CogVedioX介绍四、DAMODEL一键部署CogVideoX1. 创建丹摩实例(参考上述介绍)2. 配置环境和依赖3. 模拟与配置文件4. 开始运行4.1 调试4.2 webUI4.3 端口映射 前言 DAMODEL(丹摩智算)是一款专为满足…

MySQL的知识巩固

目录 三大范式 第一范式: 第二范式: 第三范式: 巴斯-科德范式(BCNF): 反范式: MySQL的工作原理 三大范式 第一范式: 一个字段只表明一个事情 优点: 数据一致性: 在1NF中,由于每个属性都是原子的,因此避免了在一个属性中存…

越野车TV 1.0.5337 | TV端越野赛车游戏,解锁无限金币

越野车TV是一款专为电视设计的越野赛车游戏,最初是安卓手机端的游戏,现已移植到TV端并兼容遥控器操作。这款游戏的特点是解锁了VIP,所有资源都可以免费使用。游戏采用3D横版卡通风格,提供真实的越野赛车体验。玩家可以在崎岖的赛道…

MySQL 迁移 dm

参考链接 此处为语雀内容卡片,点击链接查看:MySQL 5.7.27 迁移 DM 8 语雀 迁移前准备 以下中的命名,密码都是可修改的,这里给出的就只是一个例子 创建表空间 # 创建表空间名为 dbTest,路径为 Z:\fei\data\dm\dbT…

信息安全工程师(82)操作系统安全概述

一、操作系统安全的概念 操作系统安全是指操作系统在基本功能的基础上增加了安全机制与措施,从而满足安全策略要求,具有相应的安全功能,并符合特定的安全标准。在一定约束条件下,操作系统安全能够抵御常见的网络安全威胁&#xff…

从0开始学习Linux——文件管理

往期目录: 从0开始学习Linux——简介&安装 从0开始学习Linux——搭建属于自己的Linux虚拟机 从0开始学习Linux——文本编辑器 从0开始学习Linux——Yum工具 从0开始学习Linux——远程连接工具 从0开始学习Linux——文件目录 从0开始学习Linux——网络配置 从0开…

vue中调用全屏方法、 elementUI弹框在全屏模式下不出现问题、多级嵌套弹框蒙层遮挡问题等处理与实现方案

全屏模式下弹框不展示的原因是elementUI的弹框我们让他挂在body中了,而我们全屏的div盒子不是整个文档,这时候就找不到弹框了。 当我们把弹框改为插入到父元素上 这时候会出现蒙层盖住整个页面,什么也点不了的问题。 这是elementUI官方的一个…

特征检测与特征匹配方法笔记+代码分享

在一幅图像中,总能发现其独特的像素点,这些点可以被视为该图像的特征,我们称之为特征点。在计算机视觉领域中,基于特征点的图像特征匹配是一项至关重要的任务,因此,如何定义并识别一幅图像中的特征点显得尤…

补: 力扣145 : 二叉树的后序遍历

天才的回归 ---- 二叉树的后序遍历 描述: **给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 ** 示例: 解法:递归就不说了,看下遍历法,与先序和中序略有不同 简单来说注意两个点: 1&…

Centos8 安装 JDK / Python / MySQL / Redis / Nginx

安装 JDK 华为镜像 JDK 下载地址:https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/ 这里安装 JDK8 为例: # 这里直接通过 wget 下载 wget https://repo.huaweicloud.com:8443/artifactory/java-local/jdk/8u202-b08/jdk-8u202-linux-x…

使用轻易云平台高效集成聚水潭与南网订单数据

高效实现聚水潭与南网供应商对接的数据集成方案 普通发货对接南网供应商配送通知接口 在现代数据集成项目中,如何高效、可靠地实现不同系统之间的数据对接是一个关键挑战。本文将聚焦于一个实际案例:将聚水潭平台的数据集成到南方电网商城平台&#xff…

【经验分享】一招解决VMware虚拟机存储空间越来越大的问题

【经验分享】一招解决VMware虚拟机硬盘空间越来越大的问题 前言一、解决办法二、补充说明 前言 在使用虚拟机过程中,会出现用着用着虚拟机硬盘占用空间越来越大的问题。即使删除了文件,依然会占用宿主机的硬盘空间。如果虚拟机一开始分配的硬盘空间过大…

使用Element UI实现一个拖拽图片上传,并可以Ctrl + V获取图片实现文件上传

要在 Element UI 的拖拽上传组件中实现 Ctrl V 图片上传功能,可以通过监听键盘事件来捕获粘贴操作,并将粘贴的图片数据上传到服务器。 版本V1,实现获取粘贴板中的文件 注意,本案例需要再你已经安装了Element UI并在项目中正确配…

Ascend Extension for PyTorch是个what?

1 Ascend Extension for PyTorch Ascend Extension for PyTorch 插件是基于昇腾的深度学习适配框架,使昇腾NPU可以支持PyTorch框架,为PyTorch框架的使用者提供昇腾AI处理器的超强算力。 项目源码地址请参见Ascend/Pytorch。 昇腾为基于昇腾处理器和软…

strtok_s详解,实现使用strtok_s分割字符串,并返回包含分割符的子串

1.strtok_s函数原型 strtok_s 是一个线程安全的字符串分割函数,它是 strtok 的一个变体,用于将字符串分割成一系列的标记(tokens)。与 strtok 不同,strtok_s 需要一个额外的参数来保存上下文信息,这样它就…

Docker--Docker是什么和对Docker的了解

Docker 的本质 Docker的本质是LXC(Linux容器)之类的增强版,它本身不是容器,而是容器的易用工具。 Docker通过虚拟化技术,将代码、依赖项和运行环境打包成一个容器,并利用隔离机制来使得容器之间互相独立、…

大数据新视界 -- 大数据大厂之 Impala 性能优化:优化数据加载的实战技巧(下)(16/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

【测试框架篇】单元测试框架pytest(3):用例执行参数详解

一、前言 上一篇内容介绍了用例编写的规则以及执行用例,执行用例时我们发现有些print输出内容,结果没有给我们展示,这是因为什么原因呢?接下来我们会针对这些问题进行阐述。 二、参数大全 我们可以在cmd中通过输入 pytest -h 或…