Java知识扫盲——向上转型(类向上转型、接口向上转型)以及向上转型的优势、灵活运用

article/2025/10/3 7:04:22

目录

 

普通类示例

抽象类的向上转型,

接口向上转型:

作用:使用向上转型可以,提高代码的简洁性、灵活性、适用性。


 

普通类示例

父类:

package 普通类向上转型;public class Father {public int age = 48;public void sayAge() {System.out.println("我的年龄是:"+age);}public void myDaughter() {System.out.println("我女儿18岁");}
}

子类:

package 普通类向上转型;public class Daughter extends Father{public int age = 18;public String sex = "女";@Overridepublic void sayAge() {System.out.println("我的年龄是:"+age);}public void saySex() {System.out.println("我的性别是:"+sex);}
}

测试类:

package 普通类向上转型;public class Test {public static void main(String[] args) {System.out.println("------输出各自属性和方法------");Father father = new Father();System.out.println(father.age);father.sayAge();System.out.println("----------");Daughter daughter = new Daughter();System.out.println(daughter.age);daughter.sayAge();System.out.println(daughter.sex);daughter.saySex();System.out.println("------输出向上转型后的,属性和方法------");Father a = new Daughter();System.out.println(a.age);// a 没有了sex属性a.sayAge();// a 没有了saySex方法a.myDaughter();}}

输出结果:

------输出各自属性和方法------
48
我的年龄是:48
----------
18
我的年龄是:18
女
我的性别是:女
------输出向上转型后的,属性和方法------
48
我的年龄是:18
我女儿18岁

总结:可以看出,子类向上转型后。

1. 属性和方法,父类有的才能保留,子类特有的属性和方法,都消失。——测试类中,a不能访问sex属性和saySex方法

2. 如果子类重写了父类的方法,就调用子类重写的方法。否则掉调用父类方法——测试类中,输出a.age,结果为48,说明a的属性指向父类属性,sayAge输出18,说明调用了子类方法。(因为子类中调用age变量,指向的是子类的age=18)

图示:

抽象类的向上转型,

与上边写法,结论都一样,不再详讲,放个代码,供大家看看:

父类(抽象类)

 

package 抽象类向上转型;public abstract class Father {public int age = 48;public abstract void sayAge();public void myDaughter() {System.out.println("我女儿18岁");}
}

子类

package 抽象类向上转型;public class Daughter extends Father{public int age = 18;public String sex = "女";@Overridepublic void sayAge() {System.out.println("我的年龄是:"+age);}public void saySex() {System.out.println("我的性别是:"+sex);}}

测试类:
 

package 抽象类向上转型;public class Test {public static void main(String[] args) {System.out.println("------输出各自属性和方法------");System.out.println("抽象类不能直接实例化");System.out.println("----------");Daughter daughter = new Daughter();System.out.println(daughter.age);daughter.sayAge();System.out.println(daughter.sex);daughter.saySex();System.out.println("------输出向上转型后的,属性和方法------");Father a = new Daughter();System.out.println(a.age);// a 没有了sex属性a.sayAge();// a 没有了saySex方法a.myDaughter();}}

输出结果:

------输出各自属性和方法------
抽象类不能直接实例化
----------
18
我的年龄是:18
女
我的性别是:女
------输出向上转型后的,属性和方法------
48
我的年龄是:18
我女儿18岁

接口向上转型:

接口:
 

package 接口向上转型;public interface Father {int AGE = 48;public abstract void sayAge();}

实现类:
 

package 接口向上转型;public class Daughter implements Father{public int age = 18;public String sex = "女";@Overridepublic void sayAge() {System.out.println("我的年龄是:"+age);}public void saySex() {System.out.println("我的性别是:"+sex);}}

测试类:

package 接口向上转型;public class Test {public static void main(String[] args) {System.out.println("------输出各自属性和方法------");System.out.println("抽象类不能直接实例化");System.out.println("----------");Daughter daughter = new Daughter();System.out.println(daughter.age);daughter.sayAge();System.out.println(daughter.sex);daughter.saySex();System.out.println("------输出向上转型后的,属性和方法------");Father a = new Daughter();System.out.println(a.AGE);// a 没有了sex属性a.sayAge();// a 没有了saySex方法}}

总结:

1. 调用的方法一定是实现类的方法。——因为接口中不能出现普通方法(jdk1.8可以写,但不常用)。

2. 常量指向的是接口中的常量。——输出a.AGE结果是48。

作用:使用向上转型可以,提高代码的简洁性、灵活性、适用性。

 

话说有对比才会有伤害,咱们用向上转型和不用向上转型,做同一个工作试试。

 

假设我们要进行一项调查,随机抽取10个人,查看他的职业(咱们只写学生和老师两个职业)。

 

不使用向上转型:

学生:

package 向上转型的应用.做参数;public class Student {public void work() {System.out.println("我是学生,我的工作是学习");}}

老师:

package 向上转型的应用.做参数;public class Teacher {public void work() {System.out.println("我是老师,我的工作是教学");}}

测试类:

package 向上转型的应用.做参数;public class Test {public static void main(String[] args) {// 模拟10次随机抽人for (int i = 0; i < 10; i++) {// 生成随机数,模拟随机抽人final double d = Math.random();final int j = (int)(d*10);if (j<5) {// 传递抽取的人sayHerJob(new Student());} else {// 传递抽取的人sayHerJob(new Teacher());}}}private static void sayHerJob(Student s) {s.work();}private static void sayHerJob(Teacher t) {t.work();}
}

运行结果:

我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是学生,我的工作是学习
我是学生,我的工作是学习
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是学生,我的工作是学习
我是学生,我的工作是学习

可以看到,有两个职业sayHerJob方法就复写了一遍,如果世界上有1881种职业,你就复写1880次方法???

显然不可能,代码冗余,死板。

 

再来看看咱们的向上转型

 

我们可以看到学生和老师都是人,我们只问她们职业。

 

这句话是什么意思?约束——接口!

Person接口

package 向上转型的应用.做参数;public interface Person {void work();
}

学生:

package 向上转型的应用.做参数;public class Student implements Person {@Overridepublic void work() {System.out.println("我是学生,我的工作是学习");}}

老师

package 向上转型的应用.做参数;public class Teacher implements Person {@Overridepublic void work() {System.out.println("我是老师,我的工作是教学");}}

测试:

package 向上转型的应用.做参数;public class Test {public static void main(String[] args) {Person p = null;// 模拟10次随机抽人for (int i = 0; i < 10; i++) {// 生成随机数,模拟随机抽人final double d = Math.random();final int j = (int)(d*10);if (j<5) {// 向上转型p = new Student();} else {// 向上转型p = new Teacher();}// 传递抽取的人sayHerJob(p);}}private static void sayHerJob(Person p) {p.work();}
}

运行结果:

我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是老师,我的工作是教学
我是学生,我的工作是学习
我是老师,我的工作是教学

把学生和老师,都向上转型成Peron,参数类型都一样,只用写一个方法就行,极大的提高了代码的简洁性、适应性。

 

另外,这里向上转型是作为参数传递过去的,相应的,我们也可以作为返回值去写,同样可以极大的提高撸代码的效率。

 

个人所学和总结,如果那里不对,希望看到的大佬指正批评!


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

相关文章

java 向上转换_java的向上转型总结

在《think of java》中对向上转型有着如下的描述 看完之后很蒙圈&#xff0c;所以自己在网上找了一些描述&#xff0c;并自己做了简单的总结 简单的例子 class A{ public void A1(){ System.out.println("父类方法1"); } public void A2(){ System.out.println("…

JAVA中多态以及向上转型向下转型、重写的讲解

重写 重写(override)&#xff1a;也称为覆盖。重写是子类对父类非静态、非private修饰&#xff0c;非final修饰&#xff0c;非构造方法等的实现过程 进行重新编写, 注意&#xff01;&#xff01;&#xff01;返回值和形参都不能改变。 重写的好处在于子类可以根据需要&#x…

JAVA中的向上转型和向下转型

一、向上转型和向下转型 向上转型和向下转型是在JAVA继承操作中用到的东西&#xff0c;在讲到转型之前我们需要认识到继承过程中的对象类型转换&#xff0c;这种转换有两个特点&#xff1a; 1.这是继承过程中发生的操作 2.新类是现有类的一种类型。这种说法主要是因为现有类的方…

java转型 内存_Java向上转型及内存分析

学习设计模式的时候&#xff0c;发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。 概念 先从几个基本概念开始&#xff1a; 1. Java中的引用类型(reference type) Java中的数据类型分…

java向上转型_Java向上转型和向下转型

一、向上转型 简单的说向.上转型就是:将-一个子类类型的对象赋值给- -个父类类型的变量&#xff0c; 基本的实现语法: 父类类型变量new 子 类类型(); DEMO:向上转型 发现了可以使用父类类型的变量调用子类覆写了父类的方法&#xff0c;但是为什么不调用Worker的say()方法呢?原…

C++ 向上转型

在 C 中经常会发生数据类型的转换&#xff0c;例如将 int 类型的数据赋值给 float 类型的变量时&#xff0c;编译器会先把 int 类型的数据转换为 float 类型再赋值&#xff1b;反过来&#xff0c;float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换…

java 对象向上转型_JAVA对象向上转型和向下转型

今天做了一个测试的题目&#xff0c;发现自己还是很多问题没有静下心来做。很多问题是可以自己解决的但是自己一是没有读清题意&#xff0c;二是自己心里太急躁了。所以这个要自己应以为鉴&#xff01; 对象的转型问题其实并不复杂&#xff0c;我们记住一句话&#xff1a;“父类…

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

Java 转型问题其实并不复杂&#xff0c;只要记住一句话&#xff1a;父类引用指向子类对象。 什么叫父类引用指向子类对象&#xff1f; 从 2 个名词开始说起&#xff1a;向上转型(upcasting) 、向下转型(downcasting)。 举个例子&#xff1a;有2个类&#xff0c;Father 是父类&a…

java向上转型_Java向上转型

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

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

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

java向上转型

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

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

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

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

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

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

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

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中都是以数组的…