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

小夜勃
  • 221

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

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

比如这样的代码:

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

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

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

回复
阅读 2.3k
2 个回答

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

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

举个例子,一个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等等,复杂性一下子增加了很多。

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏