领略多态的魅力-对象向上转型 | 带你学《Java面向对象编程》之四十八

简介: 本节为读者介绍了对象多态性中的向上转型,并结合案例为读者详细说明了向上转型的作用与用法。

上一篇:初识面向对象第三特征-多态 | 带你学《Java面向对象编程》之四十七
【本节目标】
通过阅读本节内容,你将了解到向上转型在编程过程中带来的便利性与面向对象编程的魅力,学会借助继承与向上转型实现某些复杂的业务逻辑。

对象向上转型(接收或返回参数的统一性)

对象转型的处理属于多态性,而这一特性必须在继承性的基础上实现。
范例:观察一个简单代码

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() ;
    }
}

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

class Message {
    public void print() {
        System.out.println(“www.mldn.cn”) ;  
    }
}
Class DataBaseMessage extends Message {
    public void print() {
        System.out.println(“Oracle数据库连接信息…..”) ;   //执行结果: Oracle数据库连接信息…..
    }
}
public class JavaDemo{
    public static void main(String args[]) {
        Message msg = new DataBaseMessage() ;    //向上转型
        msg.print() ;
    }
}

那么这个时候就需要思考了,向上转型这种操作有什么主要的用处呢?

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() ;
    }
}

执行结果:
Oracle数据库连接信息…..
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(DataBaseMessage msg) {   //不管传递的是哪一个子类都可以接收
        msg.print() ;
    }
    public static void fun(WebServerMessage msg) {   //不管传递的是哪一个子类都可以接收
        msg.print() ;
    }
}

现在的操作利用了重载解决了当前的设计,的确可以实现与之前完全一样的效果。但是在进行程序类设计的时候除了满足于当前的要求之外,还需要做出可维护性的设计。如果说现在随着项目的发展,Message产生了3W个子类,那么这个时候每当扩充一个Message子类之后就需要追加一个fun()的方法重载,这样就对程序的维护性造成很大影响。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学

下一篇:领略多态的魅力-对象向下转型 | 带你学《Java面向对象编程》之四十九
更多Java面向对象编程文章查看此处

相关文章
|
17天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
16天前
|
安全 Java
Object取值转java对象
通过本文的介绍,我们了解了几种将 `Object`类型转换为Java对象的方法,包括强制类型转换、使用 `instanceof`检查类型和泛型方法等。此外,还探讨了在集合、反射和序列化等常见场景中的应用。掌握这些方法和技巧,有助于编写更健壮和类型安全的Java代码。
30 17
|
20天前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
79 15
|
20天前
|
Java 数据安全/隐私保护 开发者
【潜意识Java】深入理解 Java 面向对象编程(OOP)
本文介绍了Java中的面向对象编程(OOP)核心概念,包括封装、继承、多态和抽象。封装通过访问控制保护数据,提高安全性;继承支持代码复用,减少冗余;多态实现灵活的行为调用;抽象则隐藏细节,简化接口设计。掌握这些概念有助于编写高效、灵活且易于维护的代码。文章通过实例详细讲解了每个概念在Java中的应用,并总结了它们的优势。
38 3
|
1月前
|
Java
java代码优化:判断内聚到实体对象中和构造上下文对象传递参数
通过两个常见的java后端实例场景探讨代码优化,代码不是优化出来的,而是设计出来的,我们永远不可能有专门的时间去做代码优化,优化和设计在平时
31 15
|
3月前
|
Java 开发者
Java 面向对象编程
总之,Java 的面向对象编程为开发者提供了一种有效的编程范式,帮助他们构建出高质量、可维护的软件系统。理解和掌握面向对象的概念和原则是成为优秀 Java 开发者的重要基础。
209 63
|
3月前
|
安全 Java 编译器
Java对象一定分配在堆上吗?
本文探讨了Java对象的内存分配问题,重点介绍了JVM的逃逸分析技术及其优化策略。逃逸分析能判断对象是否会在作用域外被访问,从而决定对象是否需要分配到堆上。文章详细讲解了栈上分配、标量替换和同步消除三种优化策略,并通过示例代码说明了这些技术的应用场景。
Java对象一定分配在堆上吗?
|
3月前
|
存储 安全 Java
Java编程中的对象序列化与反序列化
【10月更文挑战第22天】在Java的世界里,对象序列化和反序列化是数据持久化和网络传输的关键技术。本文将带你了解如何在Java中实现对象的序列化与反序列化,并探讨其背后的原理。通过实际代码示例,我们将一步步展示如何将复杂数据结构转换为字节流,以及如何将这些字节流还原为Java对象。文章还将讨论在使用序列化时应注意的安全性问题,以确保你的应用程序既高效又安全。
|
3月前
|
存储 缓存 NoSQL
一篇搞懂!Java对象序列化与反序列化的底层逻辑
本文介绍了Java中的序列化与反序列化,包括基本概念、应用场景、实现方式及注意事项。序列化是将对象转换为字节流,便于存储和传输;反序列化则是将字节流还原为对象。文中详细讲解了实现序列化的步骤,以及常见的反序列化失败原因和最佳实践。通过实例和代码示例,帮助读者更好地理解和应用这一重要技术。
89 0
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
95 17