java 中多态的意义该如何理解?

发布于 2022-09-11 18:17:00 字数 478 浏览 16 评论 0

本人刚刚接触java, 学习基础知识的时候遇到多态这个概念, 网上查了一些资料大多只是介绍如何实现多态, 但是对多态的意义(或者说好处)没有给出非常具体的例子, 往往都是一些空话, 比如灵活性, 简化性之类的.

我自己对多态这个概念一直有个困惑, 如果衍生类可以当做父类声明, 那么声明该类型的时候, 为什么不直接使用子类? 这样不是更加清晰, 毕竟你想调用是父类的方法还是子类重写(覆盖)以后的方法看类型就很明确了. 但如果按照多态的做法, 用父类类型声明一个子类以后不会引起困惑么?

比如这样的代码:

Cat c1 = new Cat();
c1.eat(); // 我直接使用子类声明

Animal c1 = new Cat();
c1.eat(); // 使用多态

自己无法理解使用多态的好处, 有没有前辈可以给出一两个比较具体的例子来说明多态的意义和好处? 本人水平实在有限, 见谅!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡墨 2022-09-18 18:17:00

其实在java中,接口才是最能体验多态的,所以你的问题等同于另一个刚开始学面向对象大家常问的问题,为什么要面向接口开发?比如很多场合我需要一个list,但我并不在乎你的list是如何实现的,你可以随时的替换他的实现类,而不破坏我的逻辑,这就是你所说的灵活性。
软件工程这门学科从来不是教你怎么实现的,而是教你如何维护的

静赏你的温柔 2022-09-18 18:17:00

这种东西更多的是可意会,难以言传,试着回答一下吧。

在开发过程中,随着环境的变化或者需求的演进,一件事情可能或者必须使用不同的处理方式,这时候就可以使用多态来处理,将要做的事情定义成基类或接口,每种具体的处理方式就是一个个子类了。程序根据情况选择不同的子类来使用。

举个例子,一个Warrior类可以使用不同的武器,所有武器都有attack()方法,于是我们可以定义一个抽象类Weapon,它有抽象方法attack()Warrior里面有一个Weapon字段,但是具体使用哪种武器则是不确定的,所以它可能需要这样定义:

class Warrior {
    Weapon weapon;
    Warrior(Weapon weapon) {
        this.weapon = weapon;
    }
    
    void fight() {
        // 没阵亡之前不断使用手中的武器攻击敌人
        while (this.isAlive()) {
            weapon.attack();
        }
    }
}

在这段程序里面并没有出现具体的武器类只有这个基类。这个士兵使用什么武器完全在运行时根据情况决定。比如兵种不同,玩家的科技水平不同,都可能导致具体武器的不同。

如果定义成一个具体的武器,比如Sword,那么所有士兵都只能使用剑来战斗了。如果要包含不同兵种,就必须定义多个战士类,SwordWarriorBowWarrior等等,复杂性一下子增加了很多。

希望以上回答能够有所帮助。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文