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

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

‌ 本节内容视频链接: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到AnimalAnimal myAnimal = myDog; // 不需要显式转换myAnimal.eat(); // 调用Animal类的eat方法// 尝试调用Dog类的bark方法,‌但是myAnimal是Animal类型,‌所以编译错误// myAnimal.bark(); // 编译错误:‌Animal类型没有bark方法// 强制类型转换:‌从Animal到Dogif (myAnimal instanceof Dog) { // 使用instanceof检查类型安全性Dog anotherDog = (Dog) myAnimal; // 显式转换anotherDog.bark(); // 调用Dog类的bark方法} else {System.out.println("myAnimal is not a Dog.");}// 如果尝试将一个不是Dog类型的Animal对象转换为Dog,‌将会抛出ClassCastExceptionAnimal 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。‌

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 华为数通方向HCIP-DataCom H12-821题库(更新单选真题:1-10)
  • Spring中的AopUtils
  • <C++> 二叉树进阶OJ题
  • C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全
  • Vulkan 学习(6)---- vkBuffer 创建
  • Flask-SQLAlchemy 和 Alembic 的结合
  • dubbo:dubbo整合nacos实现服务注册中心、配置中心(二)
  • GUI编程之PyQt5入门详解(01)
  • SSRF以及CSRF
  • 自行车制造5G智能工厂工业物联数字孪生平台,推进制造业数字化
  • FPGA时序约束
  • 【qt】windows下qt连接数据库
  • 《AI办公类工具PPT系列之五——ChatBA》
  • day_50
  • Vue3 组件 10
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • js 实现textarea输入字数提示
  • JSDuck 与 AngularJS 融合技巧
  • Laravel5.4 Queues队列学习
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • PAT A1092
  • storm drpc实例
  • 闭包--闭包之tab栏切换(四)
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解决iview多表头动态更改列元素发生的错误
  • 两列自适应布局方案整理
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 如何在GitHub上创建个人博客
  • 自制字幕遮挡器
  • 做一名精致的JavaScripter 01:JavaScript简介
  • RDS-Mysql 物理备份恢复到本地数据库上
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #android不同版本废弃api,新api。
  • ${factoryList }后面有空格不影响
  • (SpringBoot)第七章:SpringBoot日志文件
  • (vue)页面文件上传获取:action地址
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)丶RabbitMQ的六大核心
  • (二十三)Flask之高频面试点
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)scrum常见工具列表
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net 生成二级域名
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET的微型Web框架 Nancy
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET值类型变量“活”在哪?
  • @ComponentScan比较