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

面试被问到向上转型和向下转型时,怎么回答?

目录

前置小知识

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中的继承机制,可以实现一个类继承另一个类&#xff…...

加密月解密:概述,基础篇

加密月解密:概述,基础篇 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 获取当前线程的引用总结前言 各位读…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...