当前位置: 首页 > 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。‌

http://www.mrgr.cn/news/12291.html

相关文章:

  • 安达发|企业实施APS计划排单系统会有哪些效益?
  • 深入解析Go语言os/user包:用户和组管理实战指南
  • 修改SpringBoot项目中MyBatis的mapper.xml文件的位置
  • 【精选】基于python的影片数据爬取与数据分析
  • 前端面试宝典【HTML篇】【7】
  • Solr8如何加密Solr的DataInputHandler(DIH)使用的数据库密码
  • 【赵渝强老师】构建Docker Swarm集群
  • 【精品】超市售货管理平台小程序(源码+辅导+设计)
  • 续:当有数据时添加slave2
  • 机器学习(有监督和无监督)
  • 【论文阅读】Automatic Modulation Classification Based Deep Learning: A Review(2022)
  • 浏览器中使用AI模型 实现绘制人体骨架
  • Qt详解QUrl
  • 使用GDIView工具排查GDI对象泄漏案例的若干细节总结
  • HighConcurrencyCommFramework c++通讯服务器框架 :TCP粘包解决
  • QT: 将QGraphicsScene中的所有QGraphicsItem转化成Gcode
  • Elastic Stack--EFK架构:采集Nginx与Tomcat日志等
  • Unity项目增加字体裁剪
  • git 拉取分支
  • HarmonyOS开发之Gauge(环形图表)的简单使用