课时75:对象向上转型

简介: 对象转型的处理属于多态性,而这一特性必须在继承行的基础上实现。1.常规覆写操作2.向上转型覆写操作3.向上转型的实际作用4.为什么不使用重载来解决参数的统一性问题

课时75:对象向上转型

 

摘要:对象转型的处理属于多态性,而这一特性必须在继承行的基础上实现。

1. 常规覆写操作

2. 向上转型覆写操作

3. 向上转型的实际作用

4. 为什么不使用重载来解决参数的统一性问题

 

01. 常规覆写操作

 

范例:观察一个简单代码

首先 Message和DateBaseMseeage有继承关系。然后接着写后续代码,如下图所示,那此代  码执行的是哪一个?

代码如下:

class Message {
    public void print() {
        System.out.println("www.mldn.cn");
    }
}
 
class DataBaseMessage extends Message {
    public void print() {
        System.out.println("Oracle数据库连接信息...." );
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        DataBaseMessage msg = new DataBaseMessage();
        msg.print();
    }
}

image.png

应该执行的是Oracle的连接。

本程序是一个最简单的方法覆写操作实现,整体的程序之中可以发现,由于现在实例化的是子类对象,并且子类对象覆写了父类中的Print()方法,所以调用的是被覆写过的方法。

 

02. 向上转型覆写操作

 

范例:观察向上转型

代码如下:

class Message {
    // Message类的其他代码未显示在图中
}
class DataBaseMessage extends Message {
    public void print() {
        System.out.println("Oracle数据库连接信息...." );
    }
}
 
public class JavaDemo {
    public static void main(String args[]) {
        DataBaseMessage msg = new DataBaseMessage();
        msg.print();
    }
}

image.png

整个代码中,DateBaseMessage 是Message的一个子类,向上转型。

代码如下:

class Message {
    // Message类的其他代码未在图中显示
}
class DataBaseMessage extends Message {
    public void print() {
        System.out.println("Oracle数据库连接信息...." );
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        Message msg = new DataBaseMessage();  // 向上转型
        msg.print();
    }
}

image.png

向上转型的过程很简单,没有任何强制。此时的代码不要看类名称 Message,关键字看 New的谁,并且方法 Print有没有被覆写。那此时关键字 New的是DateBaseMessage,并且方法成功实现了覆写,这个时候的输出结果应该为 Oracle的连接:

image.png

在整个代码的编写过程中,千万别看前面的 “Message msg”,

只是一种类型。那么这个时候就要进行思考了,向上转型的处理有什么实际的用处呢?

 

03. 向上转型处理的实际作用

 

例如以下程序:

class Message {
    public void print() {
        System.out.println("www.mldn.cn");
    }
}
class DataBaseMessage extends Message {
    public void print() {
        System.out.println("Oracle数据库连接信息...." );
    }
}
class WebServerMessage extends Message {
    public void print() {
        System.out.println("WEB服务器连接信息...." );
    }
}
public class JavaDemo {
    public static void main(String args[]) {
        fun(new DataBaseMessage());  // Message msg = new DataBaseMessage();
        fun(new WebServerMessage());  // Message msg = new WebServerMessage();
    }
    public static void fun(Message msg) {  // 不管现在传递是哪一个子类对象,都可以用一个参数来接收        msg.print();
    }
}

image.png

image.png

代码中有两个子类,分别为 DateBaseMessage与 WebServerMessage,所有的子类都可以向上父类自动转型。代码之中的 fun(new DateBaseMessage())就相当于Message msg = new DateBaseMessage()这个操作;同样的,fun(new WebServerMessage())就相当于Message msg = new WebServerMessage()这个操作。不管现在传递的是哪一个子类都可以用一个参数来接收。但是大家记住,每个子类都有自己不同的 Print方法。

运行结果为:

image.png

运行结果可知,传入 DateBaseMessage的时候,输出的是 “Oracle数据库连接信息……”;传入的 WebServerMessage的时候,输出的是“WEB服务器连接信息……”。


所以,向上转型的主要特点在于可以对参数进行统一的设计。但是为什么此时不使用重载来解决当前问题呢?

 

04. 为什么不使用重载来解决参数的统一性问题

 

现在的操作利用了重载解决了当前的设计,的确可以实现与之前完全一样的效果。但是在进行程序类设计的时候除了满足于当前的要求之外,还需要做出可维护性的设计,若现在随着项目的发展,Message产生了3W个子类,那么这个时候每当扩充一个Message子类之后就需要追加一个 Fun()对的方法重载,这样就对程序的维护性造成很大的影响。


用这个多态性的向上转型,主要的目的就是为了解决参数的统一问题。所以对象转型之中的向上转型,明确实现的是参数接收或返回参数的统一性,这一点是向上转型的目标。对于向上转型,主要看的是实例化的是哪一个子类,并且子类有没有进行方法覆写,如果覆写了,那么调用的方法就是被覆写的方法。


向上转型是开发中主要使用的技术。

 

相关文章
|
7月前
|
开发框架 算法 Java
Java方法重写(Override)与重载(Overload)的详细对比
在Java编程中,多态性是面向对象编程的核心概念之一。Java通过两种重要的机制来实现多态:方法重写(Override)和方法重载(Overload)。虽然这两个概念都与方法的不同实现有关,但它们在本质上有很大的区别。本文将详细对比这两种机制,帮助开发者更好地理解和应用它们。
594 5
|
12月前
|
人工智能 自然语言处理 机器人
如何从0部署一个大模型RAG应用
本文介绍了如何从零开始部署一套RAG应用,并将其集成到移动端,如钉钉群聊中。应用场景包括客服系统、智能助手、教育辅导和医疗咨询等。通过阿里云PAI和AppFlow,您可以轻松部署大模型RAG应用,并实现智能化的问答服务。具体步骤包括准备向量检索库、训练私有模型、部署RAG对话应用、创建钉钉应用及配置机器人等。
1905 2
|
9月前
|
编解码 Cloud Native 算法
通义万相:视觉生成大模型再进化
通义万相是阿里云推出的视觉生成大模型,涵盖图像和视频生成。其2.0版本在文生图和文生视频方面进行了重大升级,采用Diffusion Transformer架构,提升了模型的灵活性和可控性。通过高质量美学标准和多语言支持,大幅增强了画面表现力。此外,视频生成方面引入高压缩比VAE、1080P长视频生成及多样化艺术风格支持,实现了更丰富的创意表达。未来,通义万相将继续探索视觉领域的规模化和泛化,打造更加通用的视觉生成大模型。
|
7月前
|
Oracle Java 关系型数据库
课时48:JavaDoc文档简述
主要讲解了Java DOC文档的使用方法和技巧。首先,介绍了Java DOC的简介,强调了在开发过程中需要大量使用API文档。其次,详细解析了Java DOC的组成结构,包括位的完整定义、类的相关说明以及方法的详细解释。 1.Java DOC简介 2.Java DOC文档的组成
163 20
|
7月前
|
Java C语言 C++
课时9:Java数据类型划分(数据类型划分)
课时9介绍了Java的数据类型划分及其操作。Java数据类型分为基本数据类型和引用数据类型。基本数据类型包括八种:数值型(整形、浮点型)、字符型和布尔型;引用数据类型有数组、类和接口。重点讲解了每种数据类型的默认值、适用场景及选择原则,如整数用int,小数用double,日期时间用Long等。掌握这些内容对编程至关重要。
139 4
课时9:Java数据类型划分(数据类型划分)
|
7月前
|
Java 程序员 数据处理
课时19:Java运算符(位运算符)
课时19介绍Java中的位运算符,涵盖进制转换、位与、位或及移位操作。重点讲解了二进制与其他进制的转换方法,通过具体范例演示了位与和位或运算的过程,并展示了八进制和十六进制的处理方式。此外,还解释了逻辑运算符(&&、||)与位运算符(&、|)的区别及其应用场景,特别是位运算在加密中的应用。
153 5
|
7月前
|
Java
课时18:Java运算符(逻辑运算符)
课时18介绍了Java中的逻辑运算符(与、或、非)。通过范例详细讲解了非操作的使用,展示了如何正确应用逻辑非(!)。接着分别探讨了与操作(& 和 &&)及或操作(| 和 ||),强调了短路运算符(&& 和 ||)在性能和安全性上的优势。课程通过具体代码示例演示了不同逻辑运算符的效果及其应用场景。
176 5
|
7月前
|
Java C++
课时124:assert断言
assert断言的含义以及使用 1.断言的引入 2.生活实例理解断言 3.Java 中断言的使用
162 2
|
7月前
|
Java
课时10:Java数据类型划分(整型类型)
本文主要围绕Java中整型数据展开,详细讲解整型变量、常量的概念,整型数据运算规则,包括数据溢出问题及解决方法,数据类型转换(自动转换与强制转换)的原理和注意事项,同时介绍了整型数据默认值的相关知识,以及byte数据类型与int数据类型的关系和使用场景,帮助读者全面掌握Java整型数据的相关内容。
191 4
|
7月前
|
Java 开发者
课时98:泛型接口
本文聚焦Java泛型接口,阐述泛型不仅能在位(类)上定义,还可在接口中使用。通过实际代码示例,详细介绍泛型接口的定义以及子类实现泛型接口的两种方式,帮助读者理解其概念和应用,强调在实际编程中理解和掌握这些知识的重要性。 1.泛型接口的定义 2.泛型接口的子类实现方式
153 2