面试被问到向上转型和向下转型时,怎么回答?
目录
前置小知识
1、向上转型
补充:向上转型的三种情况
2、向下转型
使用关键字:instanceof
3、转型带来了什么好处
前置小知识
java中的继承,我们简单回顾一下
通过java中的继承机制,可以实现一个类继承另一个类,继承的类被称为子类,被继承的类被称为父类。当一个子类对象被创建时,首先会创建一个父类对象, 然后在父类对象的外部,添加上子类特有的的自己的属性,二者结合起来,就构成了一个子类对象。也就是说,子类可以继承父类的所有属性和方法,包括用private修饰的属性和方法也可以被继承,只不过一类不能直接去使用而已,可以通过父类public声明的get()方法去访问。
子类可以重写父类的方法,也可以新建自己独有的方法
1、向上转型
例如有一个Person类,该类中有一个show()方法,代码:
class Person{public void show() {System.out.println("我是一个人");}
}
有一个Student类继承了Person类,该类中重写了父类的show()方法,并且还有一个自己独有的test()方法,代码:
class Student extends Person {public void show() {System.out.println("我是一个学生");}public void test() {System.out.println("Student类独有方法");}
}
我们现在来实例化Student类,创建一个Person类的引用变量,来引用这个Student类的实例化对象,然后来调用show()方法:
public class Main {public static void main(String[] args) {Person person = new Student();person.show();}
}
测试结果:

再来调用test()方法:

我们会发现编译时就已经报错了
小结:向上转型就是,使用父类的引用变量去引用子类的实例对象。这个引用变量可以访问子类中属于父类的属性和方法,但不能访问子类中独有的属性或方法。在上述的例子中,调用show()时,由于子类重写了该方法,所以调用的是子类的show()方法
补充:向上转型的三种情况
- 直接赋值【上述代码就是】
- 方法传参
- 方法返回值
方法传参:当我们创建了一个方法,规定传入的参数是一个父类,在实际调用的时候我们可以直接传入这个父类的子类作为参数,程序也会正确运行。
public static void main(String[] args) {run(new Student());}public static void run(Person person) {person.show();}
方法返回值:当我们创造了一个方法,设定方法的返回值为父类,我们在实际返回的时候返回该父类的子类时也是没有问题的。
public static void main(String[] args) {run(new Student()).show();}public static Person run(Person person) {return person;}
2、向下转型
只有当当前对象原本就是子类对象通过向上转型才得到的,才能够成功的进行向下转型。所以并不是所有对象都可以进行向下转型。
同样是上述的代码,如下代码则是进行了向下转型:
Person person = new Student();Student student = (Student) person;
因为person引用的对象原本就是通过Student对象向上转型所得到的,所以在对person引用的对象进行向下转型后,得到的还是Student类的对象,可以使用Student类的引用变量去引用。
如果又有一个Teacher类继承了Person类,代码如下:
class Teacher extends Person {public void show() {System.out.println("我是一个老师");}public void test() {System.out.println("Teacher类独有方法");}
}
我们现在来实例化Student类,再创建一个Person类的引用变量去引用这个对象,然后我们再创建一个Teacher类的引用变量去引用向下转型的person的变量,代码:
Person person = new Student();Teacher teacher = (Teacher) person;
这样的代码,在编译时是不会出现错误的,在运行时会报错
因为person对象是Student对象通过向上转型得到的,只能向下转型成Student对象,不能转化成Teacher对象
如何解决这个问题呢?
使用关键字:instanceof
举例:
代码:
Person person = new Student();if( person instanceof Teacher) {Teacher teacher = (Teacher) person;}person.show();
测试结果:

instanceof关键字帮我们判断一个引用person向下转型后是否为Teacher类,若是则返回true,若不是则返回false。
向下转型会发生的三种情况同向上转型类似,就不赘述了~
3、转型带来了什么好处
通过向上向下转型,可以减少编程代码
举例:
此时有一个run()方法,给该方法传入一个Person参数,并调用Person对象的show()方法,代码:
public static void run(Person person) {person.show();
}
在主函数中:
public static void main(String[] args) {run(new Student());run(new Person());run(new Teacher());
}
调用run()方法时,参数不仅可以是Person对象,也可以是Student对象和Teacher对象,当传入的是Student对象或Teacher对象时,就会进行向上转型成Person对象,但调用的show()方法还是Student对象和Teacher对象的show()方法。这样就不需要在主类里面同时重载三个方法run()方法,减少了代码量
好啦,下期见~
相关文章:
面试被问到向上转型和向下转型时,怎么回答?
目录 前置小知识 1、向上转型 补充:向上转型的三种情况 2、向下转型 使用关键字:instanceof 3、转型带来了什么好处 前置小知识 java中的继承,我们简单回顾一下 通过java中的继承机制,可以实现一个类继承另一个类ÿ…...
加密月解密:概述,基础篇
加密月解密:概述,基础篇 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,oracle&…...
DC-DC升压模块隔离高压稳压电源直流变换器12v24v48v转600V1000V1100V1500V2000V3000V
特点● 效率高达 80%● 2*2英寸标准封装● 单双电压输出● 价格低● 大于600V高压,稳压输出● 工作温度: -40℃~85℃● 阻燃封装,满足UL94-V0 要求● 温度特性好● 可直接焊在PCB 上应用HRB W1~25W 系列模块电源是一种DC-DC升压变换器。该模块电源的输入电压分为&am…...
pandas数据分析(三)
书接pandas数据分析(二) 文章目录DataFrame数据处理与分析处理超市交易数据中的异常值处理超市交易数据中的缺失值处理超市交易数据中的重复值使用数据差分查看员工业绩波动情况使用透视表与交叉表查看业绩汇总数据使用重采样技术按时间段查看员工业绩Da…...
cpu performance profiling
精彩文章分享1. android performanceAndroid 性能分析工具介绍 (qq.com)手机Android存储性能优化架构分析 (qq.com)抖音 Android 性能优化系列:启动优化之理论和工具篇 (qq.com)那些年,我们一起经历过的 Android 系统性能优化 (qq.com)Android卡顿&#…...
vue2启动项目npm run dev报错 Error: Cannot find module ‘babel-preset-es2015‘ 修改以及问题原因
报错内容如下图: 说找不到模块 babel-preset-es2015。 在报错之前,我正在修改代码,使用 ElementUI 的按需引入方式,修改了 babel.config.js 。 注意:vue/cli 脚手架4版本已经使用了 babel7 ,所以项目中…...
*9 set up 注意点
1、set up 执行的时机:beforeCreate 之前执行一次,this 是 undefined 2、set up 的参数: props:值为对象,组件外传递属性,内部声明并且接收属性 context:上下文对象,其内部包含三个…...
linux目录——文件管理
个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…...
使用new bing简易教程
申请new bing 首先先申请new bing然后等待通过,如下图 申请完,用edge浏览器,若有科学方法,就能在右上角的聊天进行向AI提问 使用插件来进行直接访问New Bing 在edge浏览器中安装一个插件,地址为:Mod…...
idea插件分享 显著提高开发效率
idea插件 Prettier 作用:支持代码格式化(java、js等) 另外支持js内方法跳转和js中ajax请求跳转到java代码里面 下载:Prettier SQL Params Setter 作用:将日志中mapper输出preparing和paramters处理成完整可直接执行…...
文心一言发布我怎么看?
文心一言发布会 有想看发布会视频的朋友,关注爱书不爱输的程序猿,私信找我拿 我只简短的回答两个问题: 1.文心一言能否为百度止颓? 首先,百度的颓势是由于多种因素导致的,包括市场竞争压力、业务发展战略的失误、管理体制的问题等。要想止颓,…...
100. 增减序列
给定一个长度为 n 的数列 a1,a2,…,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一。 求至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列可能有多少种。 输入…...
操作系统之进程的初步认识(1)
进程1. 进程的相关概念1.1 进程的定义1.2 进程的概念(1)1.3 进程的概念(2)2. 进程和程序的区别3. 进程管理:3.1 进程的结构体有哪些属性(1) Pid(操作系统里指进程识别号)(2) 内存指针(3) 文件描述符表4. 进程调度:(1) 并行(2) 并发5. 进程调度需要的属性(1) 进程状态(2) 进程优…...
【Java】你真的懂封装吗?一文读懂封装-----建议收藏
博主简介:努力学习的预备程序媛一枚~博主主页: 是瑶瑶子啦所属专栏: Java岛冒险记【从小白到大佬之路】 前言 write in the front: 如何理解封装? 试想:我们使用微波炉的时候,只用设置好时间,按下“开始”…...
使用MobaXterm ssh远程登录Ubuntu 20.04
使用MobaXterm 远程登录Ubuntu 20.04 首先需要到官网下载一个MobaXterm 准备一台Ubuntu20.04的虚拟机。使用ifconfig查看IP 我这里的虚拟机是新安装的,所以会提示命令不存在,只要按照提示输入: sudo apt install net-tools接着等待安装完成…...
蓝桥杯历年真题训练
2012年第四届全国电子专业人才设计与技能大赛“自动售水机”设计任务书1. 系统框图接下来我们将任务分块: 1. 按键控制单元 设定按键 S7 为出水控制按键,当 S7 按下后,售水机持续出水(继电器接通,指示 灯 L10 点亮&…...
Spring事务报错: org.springframework.transaction.UnexpectedRollbackException
异常信息:支持当前事务,如果不存在则抛出异常。事务被回滚,因为它被标记为仅回滚 org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-onlyat org.springframe…...
Spring:IOC和AOP
Spring:IOC和AOP一. IOC(1) 引入(2) 定义(3) 作用(4) 实现(5) DI依赖注入二. AOP(1) 概念(2) Spring中的AOP(3) 入门案例0. 准备:1. 定义通知类和通知方法;2. 在通知类中描述和定义切入点 pointcut3. 用注释绑定切入点和通知方法4. 通知类&am…...
【笔记】效率之门——Python中的函数式编程技巧
文章目录Python函数式编程1. 数据2. 推导式3. 函数式编程3.1. Lambda函数3.2. python内置函数3.3. 高阶函数4. 函数式编程的应用Python函数式编程 我的AI Studio项目:【笔记】LearnDL第三课:Python高级编程——抽象与封装 - 飞桨AI Studio (baidu.com) p…...
Java【多线程基础2】 Thread类 及其常用方法
文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start 启动线程3.2, interrupt 中断线程 (重点)3.2.1, 手动设置标记位3.2.2, 使用内置标记位3.3.3, interrupt 方法 的作用3.3 sleep 休眠线程3.4, jion 等待线程3.5 获取当前线程的引用总结前言 各位读…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
