继续Kotlin的面向对象之旅。

继承:

在Java中我们知道除了final类不能被继承,其它的情况都是可以被继承的,而在Kotlin中的规则是这样的:“在Kotlin中,所有类在默认情况下都是无法被继承的,换句话说,在Kotlin中,所有类默认情况下都是final的”。其实这样更加的人性,因为平常我们写的任何java类都可以被人随时继承,而在Kotlin中只有你开放了继承权限的类才能被其它人继承,下面来看一下:

Kotlin继承与重写重要特性剖析-LMLPHP

其中报错的提示为:

Kotlin继承与重写重要特性剖析-LMLPHP

那要继承,则需要这样做:

Kotlin继承与重写重要特性剖析-LMLPHP

接下来再来看:

Kotlin继承与重写重要特性剖析-LMLPHP

那。。为啥报错了呢?看一下错误提示:

Kotlin继承与重写重要特性剖析-LMLPHP

这里又有一个规则出来:“在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化父类型,或者通过其他secondary构造方法完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。”,所以,咱们可以这样做:

Kotlin继承与重写重要特性剖析-LMLPHP

重写:

方法重写:

只要有类的继承,肯定就会有类方法的重写,所以接下来看一下在Koltin中重写是如何搞滴:

Kotlin继承与重写重要特性剖析-LMLPHP

报错提示:

Kotlin继承与重写重要特性剖析-LMLPHP

是因为Fruit有个不带参的构造方法,所以需要这样写:

Kotlin继承与重写重要特性剖析-LMLPHP

那接下来咱们在子类中来重写父类的方法:

Kotlin继承与重写重要特性剖析-LMLPHP

看下错误提示:

Kotlin继承与重写重要特性剖析-LMLPHP

所以咱们显示的加上override来看下:

Kotlin继承与重写重要特性剖析-LMLPHP

所以:

Kotlin继承与重写重要特性剖析-LMLPHP

可见在Kotlin中增加了很多的关键字,并非平白无故的就增加了,都是为了语义更加的强而增加的,想一想,在Java中对于父类的重写,如果站在子类的角度是不是很难知道该方法是重写的父类的,排除IDE的提示,但是在Kotlin中,我们只要发现方法中有override,肯定就代码是重写了父类的方法了,语义性特别的强。

接下来继续:

Kotlin继承与重写重要特性剖析-LMLPHP

接下来再来定义一个新的class:
Kotlin继承与重写重要特性剖析-LMLPHP

属性重写:

Kotlin继承与重写重要特性剖析-LMLPHP

错误提示:

Kotlin继承与重写重要特性剖析-LMLPHP

Kotlin继承与重写重要特性剖析-LMLPHP

一样的处理办法:

Kotlin继承与重写重要特性剖析-LMLPHP

接下来使用一下:

Kotlin继承与重写重要特性剖析-LMLPHP

另外还有一种重写字段的方法,就是在primary构造当中,如下:

Kotlin继承与重写重要特性剖析-LMLPHP

接下来再来定义一个新的class:

Kotlin继承与重写重要特性剖析-LMLPHP

再定义子类:

Kotlin继承与重写重要特性剖析-LMLPHP

另外有一个细节:

Kotlin继承与重写重要特性剖析-LMLPHP

Kotlin继承与重写重要特性剖析-LMLPHP

那。。如果反过来定义呢?

Kotlin继承与重写重要特性剖析-LMLPHP

这个报错是因为得再定义一个set方法才行,如下:

Kotlin继承与重写重要特性剖析-LMLPHP

那么问题来了,为啥var可以重写val属性,而val属性不能重写var? 因为一个val属性相当于一个get方法,是只读;而一个var属性相当于既有get方法又有set方法,基于这个特性,很明显多的可以复写少的,而少的不可能复写多的,所以。。说实话,有点绕~~下面最后再总结一下:

1、val  可以 override val

2、var 可以 override val

3、val 不可以 override var

本质上,val相当于get方法;var相当于get与set方法

05-23 11:24