Java向上转型的作用(有详细代码介绍)

article/2025/10/3 8:51:53

今天看到一道Java的练习题,题目如下
这里写图片描述
当时对于主函数中
Car car =(Car) new Benz();
不是很理解,也并不知道有什么意义,因为如果仅仅写Car car = new Benz(); 程序运行结果是一样的。
在经过阅读书籍和查看别的博主写的关于向上向下转型的博客后,发现题目中这么写完全就是为了出题用,它和仅仅写Car car = new Benz(); 是一样的,都是向上转型。但是相信还是会有人对于向上转型意义不太明白,所以我这里就这道题写一下关于向上转型的用法。
首先为了大家更好的理解,我对题目的程序进行了改动,增加一个price()方法。
改动后的程序如下:

class Car {public void run() {System.out.println("这是父类run()方法");}
}public class Benz extends Car {public void run() {System.out.println("这是Benz的run()方法");}public void price() {System.out.println("Benz:800000$");}public static void main(String[] args) {Car car = new Benz();car.run();//car.price();程序报错}
}

此时程序运行后输出:这里写图片描述

但是当我们用car这个对象去调用Benz类中price这个方法时,就会报错:
这里写图片描述
这就是因为我们此处进行的向上转型,car这个对象虽然指向子类,但是子类由于进行了向上转型,就失去了使用父类中所没有的方法的“权利”,在此处就是不能调用price()这个方法。

那么向上转型到底有什么用呢,到目前为止我们不仅看不到它的好处,反而发现使用了向上转型后反而不能调用子类所特有的方法了。那么向上转型的作用到底是什么呢,我们一起来看下面的代码:

class Car {public void run() {System.out.println("这是父类run()方法");}public void speed() {System.out.println("speed:0");}}class BMW extends Car {public void run() {System.out.println("这是BMW的run()方法");}public void speed() {System.out.println("speed:80");}
}public class Benz extends Car {public void run() {System.out.println("这是Benz的run()方法");}public void speed() {System.out.println("speed:100");}public void price() {System.out.println("Benz:800000$");}public static void main(String[] args) {show(new Benz());//向上转型实现show(new BMW());}public static void show(Car car) {//父类实例作为参数car.run();car.speed();}
}

上面代码中

    public static void main(String[] args) {show(new Benz());show(new BMW());}public static void show(Car car) {car.run();car.speed();}

就体现了向上转型的优点,这也体现了Java抽象编程的思想。如果此处没有向上转型,要实现show每个子类的功能,那么有几个子类就要写多少函数。代码如下:

    public static void main(String[] args) {show(new Benz());show(new BMW());}public static void show(Benz benz) {benz.run();benz.speed();}public static void show(BMW bmw) {bmw.run();bmw.speed();}

试想一下,一旦有很多子类,那么这个工作量将会比没有使用向上转型大很多。这也表明向上转型还有个优点就是提高了代码的简洁性。


总结
向上类型转换(小转大):
语法规则:<父类型> <引用变量名> = new <子类型>();
1.此时通过父类引用变量调用的方法是子类覆盖或继承
父类的方法,不是父类的方法。
2.此时通过父类引用变量无法调用子类特有的方法。


敲黑板
向上转型虽然使代码变得简洁,体现了JAVA的抽象编程思想,但是也出现了上面提到的子类无法调用其独有的方法,这要怎么解决呢?所以就有了与之对应的向下转型,弥补了向上转型所带来的缺陷。关于向下转型我会在下一次的博客中给出例子。希望对大家有帮助。


http://chatgpt.dhexx.cn/article/8ml7oqbk.shtml

相关文章

MATLAB三维数组转为二维数组(时间序列分析中很有用)

在MATLAB中三维数组转二维的方法 一、写该程序的初衷 在处理时间序列遥感数据的时候&#xff0c;我之前的做法是&#xff1a; 将时间序列数据读取为三维矩阵&#xff1b;将该数据保存为BIP格式&#xff1b;在每个像元上进行循环&#xff0c;取出其第三维&#xff08;比如有46…

Matlab一维数组及其应用

目录 1.一维数组 2.与一维数组相关的函数 3.一维数组在二维绘图中的应用 4.在已存在的图形上添加新图形 5.在一个图形窗口中绘制多个子图 6.一维数组在一元多项式运算中的应用 1.一维数组 数值数组(简称为数组)是Matlab中最重要的一种内建数据类型。数组运算是Matlab软件…

matlab 二维数组声明,Matlab字符串函数及二维数组

Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数&#xff1a;抢沙发 阅读数&#xff1a;833 strcmp(Str1,Str2),finder(S,s),strcat(S1,S2),disp(str)>> str1 str1 I am a man >> str2 str2 Iamaboy >> strcmp(str1,str2) %比较str1和str2 相同…

MATLAB 二维数组的行列操作

首先定义一个3*3的二维数组 data [1,2,3;4,5,6;7,8,9];第一列 data(:,1)第一行 data(1,:)第一列前两个数 data(1:2,1)按列展开 data(:)从第五个数到最后 data(5:end)对ADC的数据IQ分开&#xff0c;对应一列数据&#xff0c;行数据根据逗号交换 IDATAadc_data_mux(1:2:en…

复习matlab 基础知识

1、 2、a.*b就是说两个矩阵的对应元素一次相乘。 [a,b,c,d] 将数组显示。 3、for k 1:lebgth(S) 语句体 end 4、 4、while循环 while Boolean 语句体 end 5、 6、 7、break and continue break&#xff1a;跳出循环体&#xff0c;结束整个循环。 continue&#xff1a…

【Matlab编程】新手入门第三天

第三章 数组 前言1.数组的创建1.1创建多维数组 2.数组的属性2.1数组结构2.2数组大小2.3数组的维度2.4数组数据类型 3.数组操作3.1数组索引和寻址3.2数组的查找3.3数组的排序 4.关系运算和逻辑运算总结 前言 MATLAB中的数组无处不在&#xff0c;任何变量在MATLAB中都是以数组的…

matlab二维数组的创建及其变换

很基础的问题&#xff0c;但很容易忘记。。 1、MATLAB中&#xff0c;一般使用方括号&#xff08;[]&#xff09;&#xff0c;逗号&#xff08;&#xff0c;&#xff09;&#xff0c;分号&#xff08;&#xff1b;&#xff09;与空格来创建二维数组。空数组是一种非常特殊的数组…

strptime() 函数

查看更多 https://www.yuque.com/docs/share/54ad7ca7-b9cb-4d8b-a25f-c6e3ca349648

Python中的时间函数strftime与strptime对比

这两个函数&#xff0c;初看真是一脸懵逼&#xff0c;不是同一个么&#xff0c;对于小萌新来说&#xff0c;多少有点晕菜了&#xff0c;随时可能把两者混淆&#xff0c;导致程序报错或者出现小bug&#xff0c;查询了几个小时&#xff0c;到最后才发现竟然一个字母的差别.......…

python中datetime模块中strftime/strptime函数

python中datetime模块非常好用&#xff0c;提供了日期格式和字符串格式相互转化的函数strftime/strptime 1、由日期格式转化为字符串格式的函数为: datetime.datetime.strftime() 2、由字符串格式转化为日期格式的函数为: datetime.datetime.strptime() 3、两个函数都涉及日期…

strftime()函数

C 库函数 : size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。 参数说明: str -- 存储产生的结果。maxsize -- 结果可存储的最大size。fo…

strftime和strptime使用(时间日期的格式控制函数)

strftime和strptime使用 整理自《linux程序设计》 这两个函数都是时间日期的格式控制函数&#xff0c;在功能上看起来正好相反。strftime将一个tm结构格式化为一个字符串&#xff0c;strptime则是将一个字符串格式化为一个tm结构。 strftime 函数原型&#xff1a;size_t strfti…

符号函数与指示函数

1.符号函数——sign(x) 2.指示函数——

函数的声明和定义

一、函数声明&#xff1a; 1. 告诉编译器有一个函数叫什么&#xff0c;参数是什么&#xff0c;返回类型是什么。但是具体是不是存在&#xff0c;函数声明决定不了。 2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。 3. 函数的声明一般要放在头文件中的。 二、…

main函数的一些操作

系列文章目录 第一章 OC之单例模式 第二章 OC之对象初始化 第三章 OC之类和协议 第四章 OC之main函数中的操作和一些概念 文章目录 系列文章目录前言一、main函数的一些操作二 属性和成员变量三 和isEqual四 分类和拓展五 NSString的三种类型1._NSCFConstantString2._NSCFStri…

函数的介绍

自话函数 函数这一概念&#xff0c;之前在数学中是最常见的。但不要忘记最初设计计算的前辈都是一些数学大家。所以函数这一概念自然也被引入到了计算机中。 数学中函数表示的一种映射关系(集合A到集合B之间的关系)&#xff0c;而到了计算机中这一概念被延伸。 计算机中函数由…

S函数介绍

S函数介绍 S函数中使用文本方式输入公式和方程&#xff0c;适合复杂动态系统的数学描述&#xff0c;并且在仿真过程中可以对仿真参数进行更精确的描述。 S函数模块是整个Simulink动态系统的核心。 S函数时系统函数&#xff08;system function&#xff09;的简称&#xff0c;是…

指示函数(indicator function)

1. 计数器 指示函数表示 其中有哪些元素属于某一子集的次数&#xff0c;及满足某一断言或条件的统计&#xff1b; 比如Hamming Loss&#xff1a; 其中 2. 二维的离散指示函数 ⇒ assignment solution xij∈{0,1…

指示函数 indicator function

指示函数 基本定义 指示函数&#xff08;indicator function&#xff09;   数学中&#xff0c;指示函数是定义在某集合X上的函数&#xff0c;表示其中有哪些元素属于某一子集A。   指示函数有时候也称为特征函数。现在已经少用这一称呼。概率论有另一意思迥异的特征函数。…

指示函数(indicator function)含义及word使用

含义 文献公式中经常能看到有个镂空的1的符号&#xff0c;表示指示函数 当符号后的式子为True&#xff0c;则函数值为1&#xff0c;否则为0 word中如何输入&#xff1f; 插入符号&#xff1a;字体选择“Cambria”&#xff0c;将符号列表下拉至最后&#xff0c;即可看到所有镂…