kotlin精讲-第3章(6)类的继承

作者: 739c8d412b4c | 来源:发表于2017-12-06 08:52 被阅读220次

继承的概念

前面主要讲解的是单个类相关的知识点。继承则是描述多个类之间的关系。要形成继承关系,需要两个类。一个称为父类,也叫基类,一个称为子类。如果B类继承A,那么这些说法都是可以的,“B是A的子类”、“B的父类是A”、“B的基类是A”或者“A是B的父类”、“A的子类是B”、“A是B的基类”。

拥有继承关系的类,存在层级关系,现实生活中,我们可以说“男人女人都是人”。程序世界里面,我们可以说“男人”和“女人”都是继承自“人”。因为它们存在如下的层级关系:

在比如,现实生活中,我们可以说“食草动物、食肉动物都是动物,兔子和羊都是食草动物、狮子和豹子都是食肉动物”。

程序世界里面,我们可以说“食草动物、食肉动物继承动物。兔子、羊继承食草动物。狮子、豹子继承食肉动物”。因为它们也是存在如下的层级关系的:

image.png

继承分为直接继承和间接继承。兔子和羊直接继承至食草动物,兔子和羊间接继承至动物。狮子和豹子直接继承至食肉动物,狮子和豹子间接继承至动物。

继承的实现

最基本的继承关系表现

Java中的继承通过extends关键字,Kotlin中的继承关系用什么关键字表示呢?比如我们看看“男人女人都是人”怎么用程序去表示,参考代码:

image.png

通过这段代码可以得知两点。第一,Kotlin中的继承关系,通过冒号去表示。第二,父类需要通过open关键字表示,才可以被继承。

子类可以拥有父类的方法和属性

生活中我们知道“人有名字,人会吃饭”。那么再说“男人有名字,男人会吃饭”和“女人有名字,男人会吃饭”就不觉得奇怪,会觉得是理所当然。

来到程序世界其实就是,人(Person)有名字(name)属性和吃饭(eat)方法。男人和女人都是都是继承至人,所以拥有人(Person)的名字(name)属性和吃饭(eat)方法。我们通过代码可以这样去表示,参考代码:

image.png

针对以上代码可以看出很多知识点:

① 代码第8行,因为父类定义了name属性,子类可以通过次构函数,接收外界传入的name属性,然后通过super关键字,传递给了父类。

② 代码第11行,因为父类定义了name属性,子类也可以通过主构函数,接收外界传入的name属性,通过父类的主构函数传递给父类。

③ 代码第15行对象man获取了name属性,调用了eat方法都是父类定义的。

④ 代码第18行对象woman获取了name属性,调用了eat方法也都是父类定义的。

子类覆写父类的方法

比如现实生活中我们知道“人会尿尿,男人是站着尿尿,女人是蹲着尿尿”。尿尿这样的行为是男人(Man)和女人(Woman)共有的,可以定义为人(Person)的行为。男人(Man)和女人尿尿(Women)的方式各不相同,需要根据自身情况进行重写。

在程序世界里面,共有方法定义在基类里面,子类可以根据自身情况对基类的共有方法进行修改,改成符合子类的情况,这样的行为就叫方法重写或者叫方法覆写。

我们通过代码可以这样去表示,参考代码:

image.png

针对以上代码可以看出很多知识点:

① 代码第6行,基类定义的niaoniao方法,如果父类允许子类重写,需要通过open关键字标记。

② 代码第14行,子类如果重写了父类的方法,需要通过 override标记。

子类覆写父类的属性

比如现实生活中我们知道“人都有头发,男人短发居多,女人是长发居多”。人(Person)在头发样式(hairStyle)这个属性上默认值只是“有头发”。男人(Man)和女人(Woman)对头发样式(hairStyle)做了重新的定义。男人头发样式(hairStyle)多是短头发,女人男人头发样式(hairStyle)则是长头发。

在程序世界里面,共有属性定义在基类里面,子类可以根据自身情况对基类的共有属性进行修改,改成符合子类的情况,这样的行为就叫属性重写。

我们通过代码可以这样去表示,参考代码:

image.png image.png

针对以上代码可以看出很多知识点:

① 代码第2行,基类定义的hairStyel属性,如果父类允许子类重写,需要通过open关键字标记。

② 代码第15行,子类如果重写了父类的属性,需要通过 override标记。

③ 代码第23行,子类如果重写了父类的属性,需要通过 override标记。

相关文章

网友评论

    本文标题:kotlin精讲-第3章(6)类的继承

    本文链接:https://www.haomeiwen.com/subject/izxkixtx.html