2ccb3c32976baf37b1d40f38abdbb27f
第十九讲 多态(重写篇)

在之前的两讲当中,我们一起学习了java继承相关的知识,以及应用方法。

在日常的项目开发当中,继承的使用非常普遍。而且往往也不是一层继承,重要的类会有一个复杂的继承树。虽然实际应用可能更加复杂,但是常用的知识却并不多。

今天我们继续深入,来讲讲面向对象的另一个关键模块——多态。

不得不说多态是面向对象领域一个非常重要的创新,但是对于初学者来说,这个概念不是特别直观,有些难以理解。到底什么是多态呢?

我们跨过种种表象,直面它的本质,多态说白了就是同一种行为,不同的子类有不同的表达。

举个例子,还用上一讲当中的狗来举例。假设我们当下有很多种狗,比如哈士奇,金毛,等等。既然都是狗,那么肯定都能bark(叫唤)。但是显然,不同的狗的叫声是不同的,所以对于叫这个行为来说,它对于不同的狗有不同的表达,这个就叫做多态。

那么,怎么实现多态呢?

在C++当中,是通过虚指针来实现的,在java当中,我们不需要这么复杂。java专门提供了可以直接实现多态的方式,主要有三种,一种是重写,另一种是接口,还有一种是抽象类,

抽象类相对复杂一些,我们今天先来介绍一下重写(overwrite)。

重写这个概念比较好理解,说白了就是同一个方法父类有,子类也有。但是JVM在执行java代码的时候,如果发现子类当中重写了父类的方法,那么它会自动执行子类的方法,来替换父类原有的方法。

举个例子,假设我们为dog以及husky类加上bark方法。

Dog当中的bark:

public void bark() {
    System.out.println("Dog's bark");
}

Husky当中的bark:

@Override
public void bark() {
    System.out.println("Husky's bark");
}

当我们在husky当中同样加入bark的时候,编译器会提醒我们这是一个重写的方法,因此会提示我们最好在方法的上方加上@Override注解,这个注解没有任何用处,纯粹是为了提醒我们,这是一个重写的方法,也就是说它的父类当中也有一个对应的方法。

当我们创建出一个husky类,调用bark方法的时候,屏幕会出现哪一句话呢?

显然应该是husky’s bark,因为dog当中的bark已经被重写了。如果我们再创建一个新的类Corgi,也继承Dog,但是不重写bark方法呢?

```
public class Corgi extends Dog{

top Created with Sketch.