[Java] 对象类型转换和运算符 instanceof 学习笔记 [#子类转父类 #父类转子类 #对象和引用的区别]

Java-Study 基础环境搭建。 阅读详情

[Java] 对象类型转换和运算符 instanceof 学习笔记

欢迎大家收看 把简单的问题变复杂系列 : )

一、类型转换使用的情景:

  在需要将一个继承链下把一个类的对象转换为另一个类的对象(注意:这里强调转换的是对象而不是类),更确切地说其实应该是引用类型和对象类型不一致的时候考虑到对象类型转换

这里拓展一下引用和对象的区别

  • 对象:类实例化出来的叫做对象,Jvm 对对象进行操作
  • 引用:全称是引用变量,可以理解成指向对象的指针。可以通过对引用变量来操作引用变量所管理的那个对象。正因为这个性质,导致引用变量的生命周期和其管理的对象相同。
  • 内存区别:对象被实例化后要开辟内存空间,而引用对象只需管理已经被实例化出来的对象,它不会另外开辟内存空间
  • 类型区别:对象和引用不是同一类型结构,在判断(对象==引用)返回的是 False
▲ 为了更好地理解引用和实例对象,这里举个例子
class Person {
    Person tony;   ▲ 该语句只是声明了一个叫tony的Person引用类型,并没有指向任何对象
    Person john = new Person();  ▲ 该语句不仅声明了一个john的Person引用类型,还把john指向了一个Person对象
    Person amy = john;  ▲ 声明了一个Person的引用类型Amy,然后Amy又指向john,所以Amy也可以管理Person对象
}

特别注意:引用也是有自己的类型的,就像上面tony和amy,在声明时并没有指向一个对象,但他们已经作为Person的引用类型被创建在栈中。所以类型转换的问题就发生在如果这个类型的引用指向的不是自己类型的对象会怎么样。

下面详细介绍一下引用类型的赋值:当我们将一个引用赋值给另一个引用时,我们实际上复制的是对象的地址。两个引用将指向同一个对象。如:amy = john 将指向同一个对象。因此,任何一个引用对对象的操作都会对另一个引用产生影响,因为操作的是对象本身。

二、转换的方向:

  子类向上转父类:就是子类的对象当父类对象用,这种转换是推荐的或者说是安全的,因为子类是父类的超集,父包含的信息子类都有,转换后无非是把子类多余的信息剔除。

  父类向下转子类:同理,把父类的对象当子类对象用,这种做法通常是不太推荐的,因为不安全,子类的信息父类不一定全部都有,转换后使用不了子类的功能。

  本质上是引用指向发生改变

三、子类转父类详解

▲ 下面用代码来简单解释一下子类向上转父类
▲ 先规定一系列的类
class Animal {
    恰饭();
    睡觉();
}
class Cat extends Animal {
    睡觉();    ▲ 注意这里对父类的方法进行了重写!
    猫叫();
}
class Dog extends Animal {}

▲ 在同包新类中进行测试
class Test extends Cat {
    Animal a = new Animal();  ▲ 该语句通过new在堆里创建了一个Animal对象,让引用a指向该Animal类的对象的引用
    Cat kitty = new Cat();    
    
    a = kitty;     ▲ a作为Aniaml引用类型指向Cat的引用对象kitty,但a的可视范围是Cat类的Animal部分(向上转型)
                   ▲ 用 a = (Animal)kitty 理解或许更能体现子类转父类的思想
    a.恰饭();       ▲ OK
    a.睡觉();       ▲ OK 但这里是执行Cat类的睡觉,而不是Animal类的睡觉方法!
    a.猫叫();       ▲ 不行鸭!一个动物怎么就一定会猫叫呢?
    
    *** 再强调一遍,a作为Animal类型它指向了Cat类型,但只能用Cat类里面Animal部分的功能,或者就理解为把Cat当成动物用吧qwq ***
    
    Cat tom = (Cat) a;   ▲ 这里声明tom是Cat类型的,可以访问a的Cat部分内容和Animal部分内容
    tom.恰饭();           ▲ ok
    tom.睡觉();           ▲ ok
    tom.猫叫();           ▲ ok
}


看到这里可能会有小伙伴会问,那我转来转去的最后啥类型的引用还是只能用啥类型的功能嘛,转型有啥必要呀?

(害,别急嘛)下面我就来讲讲向上转型到底会有啥效果

  • 方法的变化:如果子类重写了父类的方法,那么父类的引用默认调用的是子类的重写的方法。如果不存在重写方法,他默认调用的为父类的方法。

  • 属性的变化:因为属性不存在重写,那么父类的引用调用的为父类的属性,因为子类实例的数据类型为父类的类型。

简单的说,指向子类的父类引用可以用子类的重写方法(多态的思想就体现在这了)

四、父类转子类详解

▲ 下面用代码来简单解释一下父类向下转子类,继承关系还是用上面的例子
▲ 先规定一系列的类
class Animal {
    恰饭();
    睡觉();
}
class Cat extends Animal {
    猫叫();
}
class Dog extends Animal {}
class test02 extends Cat{
    Animal a = new Animal();
    Cat kitty = new Cat();
    a = kitty;         ▲子转父,a指向Cat对象
    kitty = (Cat)a;    ▲虽然a是Animal引用类型,但已经指向Cat对象,所以能转型成功
                       ▲再次强调上面的“特别注意”,引用的类型不变,但引用指向的对象可以变
    
    Dog pluto = new Dog();
    
    pluto = (Dog)a;    ▲这里编译不报错但运行报错,因为a指向的是Cat对象,而Cat和Dog无继承关系
}

五、instanceof的使用

instanceof 是个检测 引用 能不能指向 某个对象的运算符

语法: <引用变量> instanceof <类、接口>

判断引用变量是不是后面的类、子类、实例

boolean flag = kitty instanceof Cat;            ▲检测Kitty引用的是不是Cat类,返回true
boolean flag = undefinedkitty instanceof Cat;   ▲因为未定义的Kitty不存在,是null,返回false
boolean flag = pluto instanceof Cat             ▲返回false

下面是我简单整理关于JAVA面向对象的知识小总结 欢迎观看
https://mubu.com/doc/explore/29479

Quartus Prime v18.1 standard-QuartusPrimeV18.1标准版安装过程 Quartus Prime v18.1 standard安装破解过程 下载方式1:官网下载: https://fpgasoftware.intel.com/18.1/?edition=standard&platform=windows 下载方式2:可以从我的网盘下载安装包(如果链接未时效的话): 链接:https://pan.baidu.com/s/1bq4_FcNPSflU1zGJv__rvA 提取码:o0in ----------------------------------. 阅读详情

相关推荐

Matlab实战:5分钟搞定脉冲多普勒雷达信号处理仿真(附完整代码)

本文详细介绍了如何使用Matlab在5分钟内完成脉冲多普勒雷达信号处理仿真,包括环境配置、线性调频信号生成、数字下变频处理、动目标检测及性能优化技巧。通过完整代码示例和实用技巧,帮助工程师快速验证算法可行性,提升雷达信号处理效率。

nokia的博客 944

父类和子类引用指向问题,instanceof比较子类父类问题

需要注意,特别的是:由于子类也进行了实例化,如果子类的方法中重写了父类的方法,那么JVM在编译运行的时候就会将父类的方法入口和子类重写的方法的方法体绑定到一起(动态绑定),调用父类的方法实际上就是调用了子类重写的这个方法。假设存在一个父类A和子类B,在使用上述格式代码创建一个引用指向B类实例的时候,调用B的无参构造方法,在子类无参构造方法首行,会使用super去调用父类的构造方法。而子类引用指向父类实例的时候,不难发现,子类的引用要求有3M的内存,但是父类的实例只有2M的内存,显然这是无法指向的。

dww1652238647的博客 734

UI-TARS桌面版模型部署

在 UI-TARS 中配置 VLM(视觉语言模型)模型,无论是选择云端(Hugging Face)还是本地(vLLM)部署,都需要经过一系列步骤,下面为你详细展开介绍。

二琳爱吃肉的博客 4537

Java中子父类和intanceof的关系

当子类s强转成父类f后(赋值也是同理),b仍然是a的一个实例,所以b instanceof 父类仍然是成立的。

qq_41488922的博客 375

航空发动机轴承故障诊断

《航空发动机主轴承故障诊断的挑战与HIT数据集研究》 摘要: 航空发动机主轴承作为关键部件,其可靠性直接影响飞行安全。然而,主轴承故障诊断面临信号信噪比低、传输路径复杂、故障类型多样、变工况运行等挑战。哈尔滨工业大学团队开发的HIT数据集为研究提供了真实工况下的实验数据,包含正常、内圈和外圈故障三种状态,具有高仿真度和强挑战性特点。研究表明,传统诊断方法在该数据集上准确率仅71-85%,突显了诊断难度。团队提出的ISONet新方法通过输入空间过参数化技术,将诊断准确率提升至99%以上,为航空发动机轴承故障诊

tyutwuxuan的博客 994

vnpy_ctp源码下载后转变为python可用的处理过程

vnpy_ctp源码下载后在window中编译使用

m0_37967652的博客 3327

Java instanceof关键词 和类型转换

instanceof关键词就是对象与类是否有父子关系 例: //System.out.println(x instanceof y); 能不能编译通过要看有没有父子关系,沾亲带故,没有的话编译的时候就会报错 类型转换:低转高自然就可以转换,高转低需要强制转换,和变量转换规则相似 总结:把子类转换为父类,向上转型,不用强制转换 把父类转换为子类,向下转型,需要强制转换 方便方法调用,不用再去new了,减少代码的重复。 ...

m0_61857489的博客 361

ROS2初级面试题汇总

总结和收集了一些关于ros2的问题和解答记录

qq_57633442的博客 5555

Java基础(七): instanceof用法详解

参考: Java instanceof用法详解_测试极客-优快云博客_instanceof用法

mingyuli的博客 9万+

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

V-REP(Cooprliesim EDU)自学笔记 实现UR5机械臂末端按轨迹移动

xu_white的博客 7583

【YOLO 系列】基于YOLO V8的智能车载交通标志识别系统【python源码+Pyqt5界面+数据集+训练代码】

本文详细介绍了基于YOLO V8构建智能车载交通标志识别系统的完整流程。从环境搭建、数据集准备、模型训练到PyQt5图形界面开发,提供了Python源码和实战代码,帮助开发者快速实现高精度、实时的交通标志检测应用,提升驾驶辅助系统的开发效率。

wdx012345的博客 966

instanceof 运算符的作用和核心原理、 手写实现 instanceof

【代码】instanceof 的核心原理、 手写实现 instanceof。

小草莓的博客 848

LAMMPS-使用MATLAB计算径向分布函数

首先需要使用LAMMPS进行分子动力学模拟,并获取到所需的数据文件,LAMMPS是一款开源的分子动力学模拟软件,可以模拟原子、分子和离子的运动行为,对于本文的目标假设你已经完成了LAMMPS的安装和模拟过程,获得了数据文件。)是一种重要的统计工具,用于描述原子或分子之间的空间分布情况,通过计算RDF可以获得物质的结构信息、相互作用距离以及相位转变等重要参数,本文将介绍如何使用MATLAB计算LAMMPS生成的数据文件的径向分布函数。变量替换为你的实际数据文件的名称。

weixin_50547796的博客 515

Java多态的简单理解

Java多态的简单理解

2301_76300308的博客 525

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【Java类型判断避坑指南】:instanceof为何不能用于long的真相揭秘

解决Java类型判断常见误区,揭秘instanceof的long判断为何无效。详解基本类型与包装类的区别,推荐使用Long.class或Objects.equals进行安全判断。掌握正确方法避免运行时错误,提升代码健壮性,值得收藏。

FuncTide的博客 767

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 异或_java向上转型和向下转型(干货)

java对象的类型转换对于初学者来说很多时候是蒙的,例如当初开始学的我,#手动狗头。在整理以前学的笔记的时候看到了注释要重点看,在想想自己好像几个月没有更新了,今天来水一下java类型转换问题。1.知识速记Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。Java转型分为向上转型和向下转型向上转型(up casting):父类引用指向子类对象,我们称这个过程为向上转型,属于自动...

weixin_39606911的博客 89

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java中instanceof的用法和实战

https://blog.youkuaiyun.com/qq_37192800/article/details/78861387 https://www.cnblogs.com/zjxynq/p/5882756.html   首页 博客 学院 下载 图文课 论坛 APP 问答 商城 VIP会员 活动 招聘 ITeye GitChat     写博客 赚零钱 消息...

u013452335的博客 1121

揭秘instanceof在byte类型判断中的陷阱:90%的开发者都忽略的关键细节

揭秘 instanceof 的 byte 判断陷阱,避免类型转换错误。详解其在对象类型检测中的局限性与正确用法,结合实际场景说明如何安全判断 byte 类型实例。掌握关键细节,提升代码健壮性,值得收藏。

AlgoPerch的博客 701

instanceof和Class.isAssignableFrom(...)有什么区别?

Which of the following is better? 以下哪项更好? a instanceof B or 要么 B.class.isAssignableFrom(a.getCl

CHCH998的博客 402

ctrl向下不能到最后_java向上转型和向下转型(干货)

java对象的类型转换对于初学者来说很多时候是蒙的,例如当初开始学的我,#手动狗头。在整理以前学的笔记的时候看到了注释要重点看,在想想自己好像几个月没有更新了,今天来水一下java类型转换问题。1.知识速记Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。Java转型分为向上转型和向下转型向上转型(up casting):父类引用指向子类对象,我们称这个过程为向上转型,属于自动...

weixin_35886717的博客 101

(18)面向对象-3.多态

一、多态性 1、Java引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时用的类型所决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。 2、相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。 #引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时执行它运行时类 型所具有的方法。因此,在编写J...

weixin_45579930的博客 545

instanceof的byte判断难题(底层原理+实战避坑指南)

深入解析 instanceof 的 byte 判断难题,揭示 JVM 底层类型检查机制与实际应用中的常见陷阱。涵盖对象类型判断的适用场景、正确用法及性能优化建议,帮助开发者精准规避类型转换错误。原理+实战结合,值得收藏

LogicShoal的博客 308

Java开发入门:环境配置、数据类型与运算符详解

Java作为主流的面向对象编程语言,其核心概念和环境搭建是开发者必备基础。JDK环境配置涉及JAVA_HOME变量设置和Path路径添加,这是运行Java程序的前提。Java数据类型分为基本类型和引用类型,其中基本类型包括byte、int等8种,而引用类型则指向堆内存中的对象。运算符系统包含算术、关系、逻辑等多种类型,位运算在性能优化中尤为重要。掌握这些基础知识对于使用IntelliJ IDEA等IDE进行企业级开发至关重要,也是理解面向对象编程和JVM原理的重要铺垫。

weixin_30385925的博客 430

狂神说Java基础知识(第二部分)

JAVA的基础知识 本文章为“【狂神说Java】Java零基础学习视频通俗易懂”内容笔记。视频地址为:https://www.bilibili.com/video/BV12J41137hu?p=72 instanceof(类型转换) 引用类型,判断一个对象是什么类型。例如下面,可以对比object与各种类是否一致。 使用父类实例化一个子类对象时。正常情况下,不能用这个对象,调用子类里面的方法。必须强制转化。 ...

qq_40551256的博客 284

Java对象比较:==与equals()的深度解析

在Java编程中,对象比较是基础但关键的操作,涉及引用比较与内容比较两种机制。==运算符用于比较基本数据类型的值或对象的引用地址,而equals()方法则用于比较对象的内容逻辑相等性。理解这两种比较方式的区别对于避免常见编程错误至关重要,特别是在处理字符串、集合框架和自定义对象时。从JVM实现层面看,==直接比较栈顶引用,性能更高;而equals()作为方法调用更灵活但开销略大。实际开发中,正确使用比较机制能提升代码健壮性,如在哈希集合操作时必须保持equals()与hashCode()的一致性。掌握这些核

weixin_34327223的博客 365

equals方法使用技巧

Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。 如果两个对象那个具有相同的引用,他们一定是相同的,从这方面看,将其作为默认操作也是合乎情理的。然而对于多数类来说,这种判断没有意义,通常我们需要将测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。 ==和equals的区别 ...

拖延症重症患者 566
下一篇: [Java] 数据的初始化
Jack.Chanel
博客等级 码龄7年 16粉丝 36原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值