面向对象09:instanceof和类型转换

news2024/9/20 16:31:16

‌ 本节内容视频链接:https://www.bilibili.com/video/BV12J41137hu?p=72&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5icon-default.png?t=N7T8https://www.bilibili.com/video/BV12J41137hu?p=72&vd_source=b5775c3a4ea16a5306db9c7c1c1486b5  instanceof是Java中的一个二元运算符,‌用于检查一个对象是否是一个类的实例,‌或者是一个类的子类的实例‌。‌

        其语法形式为“object instanceof class”,‌其中,‌object是一个对象引用,‌class是一个类名或者接口名。‌instanceof运算符返回一个布尔值,‌如果对象是指定类型的实例,‌则返回true,‌否则返回false。‌

        这个运算符在实际开发中常常用于进行类型检查,‌尤其是在处理多态性方面非常有用。‌它允许程序在运行时查询对象的实际类型,‌从而根据对象的实际类型来执行不同的操作。‌

        总的来说,‌instanceof是Java中一个非常有用的运算符,‌它提供了在运行时检查对象类型的能力,‌使得程序更加灵活和健壮‌

代码示例:

class Animal {}
class Dog extends Animal {}

public class TestInstanceof {
    public static void main(String[] args) {
        Animal myAnimal = new Animal();
        Animal myDog = new Dog();

        // 检查myAnimal是否是Animal的一个实例
        System.out.println(myAnimal instanceof Animal); // 输出 true

        // 检查myAnimal是否是Dog的一个实例
        System.out.println(myAnimal instanceof Dog); // 输出 false

        // 检查myDog是否是Animal的一个实例
        System.out.println(myDog instanceof Animal); // 输出 true

        // 检查myDog是否是Dog的一个实例
        System.out.println(myDog instanceof Dog); // 输出 true
    }
}

        在这个例子中,‌instanceof运算符用于检查对象是否是特定类或其子类的实例。‌myAnimalAnimal类的一个实例,‌但不是Dog类的一个实例。‌myDogDog类的一个实例,‌由于Dog继承自Animal,‌所以它也是Animal类的一个实例。‌

Java中的引用类型转换

        在Java中,‌引用类型转换主要涉及两种类型:‌自动类型转换(‌也称为隐式类型转换)‌和强制类型转换(‌也称为显式类型转换)‌。‌

1.‌自动类型转换‌:‌
        自动类型转换发生在将一个引用类型赋值给另一个引用类型时,‌如果这两种类型之间存在继承关系,‌并且是从子类到父类的赋值。‌此时,‌不需要进行任何显式操作,‌Java编译器会自动完成类型转换。‌例如,‌将一个Dog类型的对象赋值给一个Animal类型的变量时,‌会发生自动类型转换,‌因为DogAnimal的子类。‌

2.‌强制类型转换‌:‌
        强制类型转换发生在将一个引用类型赋值给另一个引用类型时,‌如果这两种类型之间存在继承关系,‌并且是从父类到子类的赋值。‌此时,‌必须进行显式操作,‌即使用强制类型转换语法(子类类型) 父类引用。‌例如,‌将一个Animal类型的对象赋值给一个Dog类型的变量时,‌必须进行强制类型转换,‌因为Animal不是Dog的子类,‌但DogAnimal的子类,‌所以可能存在这样的转换关系。‌

        在进行强制类型转换时,‌需要注意类型转换的安全性。‌如果父类引用实际上并不指向一个子类对象,‌那么强制类型转换将会导致ClassCastException异常。‌因此,‌在进行强制类型转换之前,‌通常使用instanceof运算符来检查父类引用是否实际上指向一个子类对象,‌以确保类型转换的安全性。‌

        总之,‌Java中的引用类型转换包括自动类型转换和强制类型转换。‌自动类型转换是安全的,‌而强制类型转换需要谨慎处理,‌以避免运行时异常。‌

        以下是一个Java引用类型转换的代码示例,‌包括自动类型转换和强制类型转换,‌并附带instanceof运算符的使用来说明类型转换的安全性。‌

class Animal {
    void eat() {
        System.out.println("This animal eats food.");
    }
}

class Dog extends Animal {
    void bark() {
        System.out.println("The dog barks.");
    }
}

public class TestReferenceCasting {
    public static void main(String[] args) {
        // 创建一个Dog对象
        Dog myDog = new Dog();

        // 自动类型转换:‌从Dog到Animal
        Animal myAnimal = myDog; // 不需要显式转换
        myAnimal.eat(); // 调用Animal类的eat方法

        // 尝试调用Dog类的bark方法,‌但是myAnimal是Animal类型,‌所以编译错误
        // myAnimal.bark(); // 编译错误:‌Animal类型没有bark方法

        // 强制类型转换:‌从Animal到Dog
        if (myAnimal instanceof Dog) { // 使用instanceof检查类型安全性
            Dog anotherDog = (Dog) myAnimal; // 显式转换
            anotherDog.bark(); // 调用Dog类的bark方法
        } else {
            System.out.println("myAnimal is not a Dog.");
        }

        // 如果尝试将一个不是Dog类型的Animal对象转换为Dog,‌将会抛出ClassCastException
        Animal notADog = new Animal();
        // 下面的代码将会抛出ClassCastException
        // Dog yetAnotherDog = (Dog) notADog; // 运行时错误:‌ClassCastException
    }
}

在这个示例中:‌

  • myDog是一个Dog类型的对象。‌
  • myDog赋值给myAnimal时,‌发生了自动类型转换,‌因为DogAnimal的子类。‌
  • 尝试通过myAnimal调用Dog类的bark方法会导致编译错误,‌因为myAnimalAnimal类型,‌而Animal类型没有bark方法。‌
  • 使用instanceof运算符检查myAnimal是否是Dog类型的一个实例,‌如果是,‌则进行强制类型转换,‌并调用bark方法。‌
  • 尝试将一个不是Dog类型的Animal对象转换为Dog类型将会导致ClassCastException。‌

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

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

相关文章

浅谈【数据结构】栈和队列之队列

目录 1、队列 1.1思想 2、队列的两类 2.1顺序队列 2.2链式队列 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错,说的就是你,不用再怀疑!!! 希望我的文章内容能对你有帮助,一起努力吧&a…

MATLAB 沿任意方向分层点云(82)

MATLAB 沿任意方向分层点云(82) 一、算法介绍二、算法实现1.代码2.效果更多内容参考: MATLAB点云处理学习 一、算法介绍 沿着某个方向,将点云分割为多层,每层点云使用不同颜色进行可视化显示,具体代码和不同方向的分层效果如下: 二、算法实现 1.代码 % Load point c…

学生信息管理系统的设计与实现(包含文档、源码、sql脚本、导入视频教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 学生信息管理系统拥有三种角色,分别为学生、教师和管理员,功能更加完善,可以作为初学者参照学习课程设计。 学生:班级通讯录查询、个人信息…

一键生成PPT只需这一步!AI先行者全面指南

在当今快节奏的工作生活中,我们需要不断地准备各种报告和演示文稿。传统的PPT制作方式往往耗费大量时间和精力,而AI先行者的出现改变了这一切。这款强大的智能工具能够帮助您快速生成高质量的PPT,提高工作效率。今天,我们将为您带…

CLASS1:文献管理软件使用

1 文献查阅 引新(3年内)不引旧引用经典2 文献检索网站汇总 Web of Science(论文中了之后下载证明) Author Search - Web of Science Core Collection (clarivate.cn) X-MOL(查阅文献) X-MOL学术平台 计算机, 热门类期刊, - X-MOL Scidown(下载原文) Sci论文期刊检索|

zabbix监控进程、日志、主从(状态、延迟)

环境:rocky Linux9虚拟机四台,zabbix端为服务端,node6为客户端,node4为mariadb主,node7为mariadb从 一、zabbix监控进程 以httpd服务为例 1、客户端安装httpd [rootnode6 ~]# yum -y install httpd [rootnode6 ~]#…

微服务Gateway服务⽹关

一、Gateway服务⽹关 1.1为什么需要⽹关 Gateway⽹关是我们服务的守⻔神,所有微服务的统⼀⼊⼝。 ⽹关的核⼼功能特性: 请求路由和负载均衡:⼀切请求都必须先经过gateway,但⽹关不处理业务,⽽是根据某种规则&…

专利写作笔记

最近又要写专利,每次写专利的时候都找不到之前的专利笔记,这次发到网站上记录一下。 专利文件:1.权利要求书、2.说明书、3.说明书附图、4.说明书摘要、5.摘要附图 明确三点:①和现有方案的区别点(哪个步骤不同&#x…

【02】ctf工具ECCTOOL工具的安装和使用

2.ECCTOOL工具的安装和使用 工具的介绍: 一款非常好用的计算ECC的工具,可以处理一些小数值的计算,点击就可以使用,非常方便实用,具体的使用方法可以参考下面图中的介绍,解决一定的ECC椭圆曲线的问题&…

4款在线视频压缩工具,帮你的视频文件 轻松“瘦身” 。

设备里面视频太多,内存不够怎么办?视频文件太大不好传输怎么办?视频文件大小受规则限制怎么办? 别担心!有了这4款视频压缩软件,轻轻松松帮你搞定这些问题。 1、福昕视频高效压缩 直通车:www.f…

进制转换计算幸运数出现次数(华为od机考题)

一、题目 1.原题 有位客人来自异国&#xff0c;在该国使用m进制计数。 该客人有个幸运数字n(n<m)&#xff0c;每次购物时&#xff0c; 其总是喜欢计算本次支付的花费(折算为异国的价格后)中存在多少幸运数字。 问&#xff1a;当其购买一个在我国价值k的产品时&#xff0c;…

AI在医学领域:GluFormer一种可泛化的连续血糖监测数据分析基础模型

糖尿病是一种全球性的健康挑战&#xff0c;影响着各个年龄段和不同地理区域的人群。根据最新数据&#xff0c;全球糖尿病患者人数已超过5亿&#xff0c;且每年以惊人的速度增长&#xff0c;相关的医疗费用也居高不下。2型糖尿病&#xff08;T2DM&#xff09;作为最主要的糖尿病…

lit-llama代码笔记--LLaMA Model

代码来自&#xff1a;lit-llama modelscope模型下载 &#xff1a;llama-7b 下载后的模型需要转换为lit-llama使用的格式&#xff0c;详见 howto 文件夹下的 download_weights.md 文中代码为了方便说明&#xff0c;删减了一些内容&#xff0c;详细代码请查看源码。 generate …

u盘突然说要格式化才能访问?如何跳过格式化打开U盘

在日常使用U盘的过程中&#xff0c;有时我们会突然遇到U盘无法直接访问&#xff0c;系统提示需要格式化才能继续使用的情况。这往往让人措手不及&#xff0c;尤其是当U盘中存储着重要数据时。面对这样的困境&#xff0c;许多用户可能会感到焦虑和无助。然而&#xff0c;不必过于…

SQLserver中的触发器和存储过程

在 SQL Server 中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在指定的数据库表上发生特定的数据修改事件时自动执行。触发器可以用于执行各种任务&#xff0c;如数据验证、数据审计、自动更新相关表等。 触发器的类型 SQL Server 支持以下几种类型的触发器&#x…

如何构建基于Java SpringBoot的保险业务管理与数据分析系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

UE管理内容 —— FBX导入选项参考

目录 Static Mesh Options Skeletal Mesh Options Transform Miscellaneous Material Options Fbx File Information 命名规范 StaticMesh SkeletalMesh AnimationSequence MorphTarget 导入器将自动检测要导入的文件类型&#xff0c;并相应地调整其接口&#xff1…

Java学习_21_多线程JUC

文章目录 前言多线程并发与并行多线程的实现方式Thread类Runnable接口Callable接口和Future接口 Thread类的相关方法线程对象线程优先级守护线程出让线程/礼让线程插入线程/插队线程 线程的相关问题生命周期安全问题Lock锁死锁等待唤醒机制&#xff08;生产者和消费者&#xff…

微信服务号网页授权域名配置数不够方案验证

文章目录 问题说明方案验证涉及工具结论 问题说明 微信服务号网页授权域名只能配置两个&#xff0c;而又没法直接配置主域名的形式&#xff0c;目前只能选取其中的一个业务域名来进行统一跳转解决。 方案验证 服务号现有配置数量限制如下&#xff1a; 申请测试号验证&#…

数据仓库系列 5:什么是事实表和维度表,它们有什么作用?

目录 1. 引言&#xff1a;事实表与维度表的魔力2. 事实表&#xff1a;业务活动的数字足迹2.1 什么是事实表?2.2 事实表的特征2.3 事实表的类型2.4 事实表示例2.5 事实表的作用2.6 事实表的设计原则2.7 事实表的查询示例 3. 维度表&#xff1a;为数据赋予意义3.1 什么是维度表?…