java 向上转型_Java 转型问题(向上转型和向下转型)

article/2025/10/3 7:08:38

Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象。

什么叫父类引用指向子类对象?

从 2 个名词开始说起:向上转型(upcasting) 、向下转型(downcasting)。

举个例子:有2个类,Father 是父类,Son 类继承自 Father。

第 1 个例子:

Fatherf1=newSon();// 这就叫 upcasting (向上转型)// 现在 f1 引用指向一个Son对象Sons1 =(Son)f1;// 这就叫 downcasting (向下转型)// 现在f1 还是指向 Son对象

第 2 个例子:

Fatherf2 =newFather();Sons2 =(Son)f2;// 出错,子类引用不能指向父类对象

你或许会问,第1个例子中:Son s1 = (Son)f1; 问为什么是正确的呢。

很简单因为 f1 指向一个子类对象,Father f1 = new Son(); 子类 s1 引用当然可以指向子类对象了。

而 f2 被传给了一个 Father 对象,Father f2 = new Father(); 子类 s2 引用不能指向父类对象。

总结:

1、父类引用指向子类对象,而子类引用不能指向父类对象。

2、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转换吗,如:

Fatherf1 =newSon();

3、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转换,如:

f1 就是一个指向子类对象的父类引用。把f1赋给子类引用 s1 即 Son s1 = (Son)f1;

其中 f1 前面的(Son)必须加上,进行强制转换。

一、向上转型。

通俗地讲即是将子类对象转为父类对象。此处父类对象可以是接口。

1、向上转型中的方法调用:

实例

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 public classAnimal {2

3 public voideat(){4 System.out.println("animal eatting...");5 }6 }7 class Bird extendsAnimal{8

9 public voideat(){10 System.out.println("bird eatting...");11 }12

13 public voidfly(){14

15 System.out.println("bird flying...");16 }17 }18 classMain{19 public static voiddoEat(Animal h) {20 h.eat();21 }22 public static voidmain(String[] args) {23

24 Animal b=new Bird(); //向上转型

25 b.eat();26 //! error: b.fly(); b虽指向子类对象,但此时丢失fly()方法

27 Animail c1=newAnimal();28 Bird c2=newBird();29 doEat(c1);30 doEat(c2);//此处参数存在向上转型

31 }32 }

转型

注意这里的向上转型:

Animalb=newBird();//向上转型b.eat();

此处将调用子类的 eat() 方法。原因:b 实际指向的是 Bird 子类,故调用时会调用子类本身的方法。

需要注意的是向上转型时 b 会遗失除与父类对象共有的其他方法。如本例中的 fly 方法不再为 b 所有。

2、向上转型的作用

看上面的代码:

publicstaticvoiddoEate(Animailh){h.sleep();}

这里以父类为参数,调有时用子类作为参数,就是利用了向上转型。这样使代码变得简洁。不然的话,如果 doEate 以子类对象为参数,则有多少个子类就需要写多少个函数。这也体现了 JAVA 的抽象编程思想。

二、向下转型。

与向上转型相反,即是把父类对象转为子类对象。

实例

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

public classAnimail {private String name="Animail";public voideat(){

System.out.println(name+" eate");

}

}class Human extendsAnimail{private String name="Human";public voideat(){

System.out.println(name+" eate");

}

}classMain {public static voidmain(String[] args) {

Animail a1=new Human();//向上转型

Animail a2=newAnimail();

Human b1=(Human)a1;//向下转型,编译和运行皆不会出错//Human c=(Human)a2;//不安全的向下转型,编译无错但会运行会出错

}

}

实例

实例

Animail a1=new Human();//向上转型

Human b1=(Human)a1;// 向下转型,编译和运行皆不会出错

这里的向下转型是安全的。因为 a1 指向的是子类对象。

Animail a2=new Animail();

Human c=(Human)a2;//不安全的向下转型,编译无错但会运行会出错

运行出错:

Exception in thread "main" java.lang.ClassCastException: study.转型实例.Animail cannot be cast to study.转型实例.Human

at study.转型实例.Main.main(Main.java:8)

向下转型的作用

向上转型时 b会遗失除与父类对象共有的其他方法;可以用向下转型在重新转回,这个和向上转型的作用要结合理解。

三、当转型遇到重写和同名数据

看下面一个例子,你觉得它会输出什么?

public classA {public int i=10;voidprint(){

System.out.println("我是A中的函数");

}

}class B extendsA{public int i=20;voidprint(){

System.out.println("我是B中的函数,我重写了A中的同名函数");

}voidspeek(){

System.out.println("向上转型时我会丢失");

}public static voidmain(String[] args) {

B b=newB();

A a=b;//此处向上转型

b.print(); System.out.println(b.i);

b.speek();

a.print(); System.out.println(a.i);

((B) a).speek();//a在创建时虽然丢失了speek方法但是向下转型又找回了

}

}

结果

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

我是B中的函数,我重写了A中的同名函数20向上转型时我会丢失

我是B中的函数,我重写了A中的同名函数10向上转型时我会丢失

结果

我们发现同名数据是根据创建对象的对象类型而确定,而这个子类重写的函数涉及了多态,重写的函数不会因为向上转型而丢失

多态存在的三个必要条件

继承

重写

父类引用指向子类对象

所以不要弄混淆了,父类的方法在重写后会被子类覆盖,当需要在子类中调用父类的被重写方法时,要使用super关键字


http://chatgpt.dhexx.cn/article/Otbshbsb.shtml

相关文章

java向上转型_Java向上转型

向上类型转换: 1.可以通过父类引用变量调用的方法是子类覆盖或继承父类的方法。 2.父类引用变量无法调用子类新增成员变量和新增成员方法。 举个例子 public classAnimal { public voidsleep() { System.out.println("Animal sleep"); } public voidjump(…

向上转型与向下转型(超详细)

本文利用代码例子解释向上转型与向下转型,文末有举例整合原代码。 首先,我们要知道:转型发生在继承后,也就是父类子类存在的前提下。其次,我们要清楚:向下转型的前提是已经发生了向上转型,向下转…

java向上转型

我们知道按照现有类的类型来创建新类的方式为继承。 换句话说 “新类是现有类的一种类型” 因为继承可以确保父类中所有的方法在子类中也同样有效,所以能够向父类发送的所有信息也同样可以向子类发送。 这儿有一个例子: public class Test {public sta…

类中的向上转型与向下转型详解

我们的类与类之间会存在继承关系,子类继承父类,一个父类可以有多个子类,例如Animal类就可以有Cat子类,Dog子类,等等。那么我们在运用的时候根据不同的场景会出现向上转型和向下转型的情况。 一、向上转型 1、Animal a…

【基础知识】向上转型和向下转型

向上转型和向下转型的利弊 一、向上转型 好处:隐藏了子类型,提高了代码的扩展性。 坏处:只能使用父类的功能,不能使用子类特有功能,功能被限定。 使用场景:不需要面对子类型,通过提高扩展性&am…

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

今天看到一道Java的练习题,题目如下 当时对于主函数中 Car car (Car) new Benz(); 不是很理解,也并不知道有什么意义,因为如果仅仅写Car car new Benz(); 程序运行结果是一样的。 在经过阅读书籍和查看别的博主写的关于向上向下转型的…

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

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

Matlab一维数组及其应用

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

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

Matlab字符串函数及二维数组 发布时间:2017年07月28日 评论数:抢沙发 阅读数: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分开,对应一列数据,行数据根据逗号交换 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:跳出循环体,结束整个循环。 continue&#xff1a…

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

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

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

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

strptime() 函数

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

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

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

python中datetime模块中strftime/strptime函数

python中datetime模块非常好用,提供了日期格式和字符串格式相互转化的函数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程序设计》 这两个函数都是时间日期的格式控制函数,在功能上看起来正好相反。strftime将一个tm结构格式化为一个字符串,strptime则是将一个字符串格式化为一个tm结构。 strftime 函数原型:size_t strfti…

符号函数与指示函数

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

函数的声明和定义

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