博客
关于我
Java-笔记12
阅读量:790 次
发布时间:2023-01-27

本文共 1672 字,大约阅读时间需要 5 分钟。

Java 进阶主题:面向对象特征之多态性解析

多态性是面向对象编程中的一项核心概念,值得我们深入理解和掌握。本文将从定义到实现再细说多态性的魅力。

多态性的基本概念

多态性是指:通过一个引用类型(如引用变量)可以指向不同类型的对象,并且这些对象可以响应同样的方法调用。多态性最明显的体现是方法的多态性。具体来说:

  • 在编译时,只能看见引用类型声明的方法 Signatures。
  • 在运行时,根据引用所指向的实际对象类型,会调用对象类中被重写的方法版本。
  • 多态性可以带来最终的代码升级性,即后期可以通过动态交换对象来改变行为,而无需重新编译。

    多态性的实现条件

    多态性的实现需要两个前提条件:

    • 继承性:必须有一个继承关系,子类继承父类。
    • 方法重写:子类对父类中方法进行了重写,即覆盖了父类的方法。

    实际案例分析

    学习案例:PersonTest类

    public class PersonTest {    public static void main(String[] args) {        // 父类引用指向不同子类对象        Person p1 = new Person(); // 父类引用指向父类对象        p1.eat(); // 调用父类eat方法        Man man = new Man(); // 父类引用指向子类对象        man.eat(); // 调用子类重写的eat方法        man.age = 25; // 设置属性        man.earnMoney(); // 调用子类特有的方法         // 对同一方法进行多次调用        System.out.println("*******************");        // 对象的多态性:父类引用指向子类对象        Person p2 = new Man(); // Person引用指向Man对象        p2.eat(); // 调用Man重写的eat方法        p2.walk(); // 调用子类特有的walk方法        // p2.earnMoney(); // earnMoney方法仅在Man类中存在    }}

    Run-time Polymorphism at Play

    从上述代码可以看出,当调用 p2.eat() 时,由于 p2 是一个 Person 引用指向 Man 对象,会自动调用 Man 类中重写的 eat 方法。这种特性使得系统在运行时能够根据实际对象类型自动选择合适的方法进行调用,这正是多态性的魅力所在。

    Java中的多态性的实现机制

    在Java中,所有引用变量都以某种方式储存在堆内。多态性其实是显式或者隐式地通过引用如何指向对象来实现的。具体来说:

  • 引用类型的确定性:在编译时,引用类型是明确的,这一点决定了在编译阶段可以知道能够调用哪些方法。
  • 实际对象的不确定性:在运行时,实际对象可以是引用类型的任何实现类(子类),这在方法调用时需要考虑进去。
  • 关键点:

    • 编译时行为:只看到父类中的方法 Signatures。
    • 运行时行为:调用子类重写的方法。
    • 方法调用的虚拟化:称为“虚拟方法调用”(VTable / Method Resolution at Runtime)。

    多态性的局限性

    虽然多态性提供了很大的灵活性,但它也有一些局限性:

  • 属性的多态性:属性的访问不是多态的,会在编译时根据引用类型来获取属性值。
  • 构造器的多态性:构造器(ctors)的调用是确定性的,只能看到引用类型的指定的构造器。
  • 性能开销:多态性需要在方法调用时进行配置(vtable lookup),这意味着有潜在的性能开销。
  • 总结

    多态性是面向对象编程中的一项核心概念,它为系统提供了高度的灵活性和可扩展性。通过多态性,可以在同一个引用类型下,具备不同的行为。然而,理解多态性的实现机制和实际应用场景,对于编写更高效和可靠的Java程序至关重要。

    转载地址:http://zdryk.baihongyu.com/

    你可能感兴趣的文章
    2025版最新网络安全入门书籍整理大全,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新网络安全知识入门及学习流程(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了
    查看>>
    2025版网络工程11个高含金量证书(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025自学成为黑客必读的5本书籍,带你从小白进阶成大佬
    查看>>
    20万高薪专业-网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了?
    查看>>
    24 WEB漏洞-文件上传之WAF绕过及安全修复_阿里云盾waf绕过怎么修复
    查看>>
    #12 btrfs文件系统
    查看>>
    #3194. 去月球
    查看>>
    24.线程
    查看>>
    #Leetcode# 28. Implement strStr()
    查看>>
    $route 和 $router详解、区别、示例代码
    查看>>
    $scope angular在controller之外调用
    查看>>
    &和&&的区别
    查看>>
    (215:断言失败)函数‘;DFT‘中的type==CV_32FC1||type==CV_32FC2||type==CV_64FC1||type==CV_64FC2;
    查看>>
    (AS3)BitmapData.draw比BitmapData.copyPixel能做得更多
    查看>>
    (discord.py) 有没有办法让 on_message 事件查看嵌入式消息而不是普通消息?
    查看>>