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

2024-08-25 20:20

本文主要是介绍面向对象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。‌

这篇关于面向对象09:instanceof和类型转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1106561

相关文章

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

ffmpeg面向对象-待定

1.常用对象 rtsp拉流第一步都是avformat_open_input,其入参可以看下怎么用: AVFormatContext *fmt_ctx = NULL;result = avformat_open_input(&fmt_ctx, input_filename, NULL, NULL); 其中fmt_ctx 如何分配内存的?如下 int avformat_open_input(

09 生命周期

生命周期 beforeCreatecreatedbeforeMountmountedbeforeUpdateupdatedbeforeDestorydestoryed 辣子鸡:香辣入口,犹如吃了炫迈一样 - - - 根本停不下来 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport"

chapter06 面向对象基础 知识点Note

文章目录 前言类的设计 属性和行为对象的内存解析 (堆 栈 方法区)类的成员之一 变量(属性) field类的成员之二 方法 method对象数组方法重载 overload可变个数的形参 语法糖方法的值传递机制递归关键字package importMVC设计模式import导入面向对象特征之一 封装类的成员之三 构造器JavaBeanUML类图 前言 ` 面向对象封装 面向

Learn ComputeShader 09 Night version lenses

这次将要制作一个类似夜视仪的效果 第一步就是要降低图像的分辨率, 这只需要将id.xy除上一个数字然后再乘上这个数字 可以根据下图理解,很明显通过这个操作在多个像素显示了相同的颜色,并且很多像素颜色被丢失了,自然就会有降低分辨率的效果 效果: 但是这样图像太锐利了,我们加入噪声去解决这个问题 [numthreads(8, 8, 1)]void CSMain(uint3 id

【JVM】JVM栈帧中的动态链接 与 Java的面向对象特性--多态

栈帧 每一次方法调用都会有一个对应的栈帧被压入栈(虚拟机栈)中,每一个方法调用结束后,都会有一个栈帧被弹出。 每个栈帧中包括:局部变量表、操作数栈、动态链接、方法返回地址。 JavaGuide:Java内存区域详解(重点) 动态链接 动态链接:指向运行时常量池中该栈帧所属方法的引用。 多态 多态允许不同类的对象对同一消息做出响应,但表现出不同的行为(即方法的多样性)。 多态

【JavaScript】如何模拟一个instanceof

首先看一下instanceof的用法。 a instanceof B 判断的是,a是否为B的实例,即a的原型链上是否存在B的构造函数。 function Person(name) {this.name = name}const p = new Person('mike')p instanceof Person // true 这里的 p 是 Person 构造出来的实例对象。 p._

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)