Kotlin继承与重写重要特性剖析
继续Kotlin的面向对象之旅。
继承:
在Java中我们知道除了final类不能被继承,其它的情况都是可以被继承的,而在Kotlin中的规则是这样的:“在Kotlin中,所有类在默认情况下都是无法被继承的,换句话说,在Kotlin中,所有类默认情况下都是final的”。其实这样更加的人性,因为平常我们写的任何java类都可以被人随时继承,而在Kotlin中只有你开放了继承权限的类才能被其它人继承,下面来看一下:
其中报错的提示为:
那要继承,则需要这样做:
接下来再来看:
那。。为啥报错了呢?看一下错误提示:
这里又有一个规则出来:“在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化父类型,或者通过其他secondary构造方法完成这个任务,不同的secondary构造方法可以调用父类型不同的构造方法。”,所以,咱们可以这样做:
重写:
方法重写:
只要有类的继承,肯定就会有类方法的重写,所以接下来看一下在Koltin中重写是如何搞滴:
报错提示:
是因为Fruit有个不带参的构造方法,所以需要这样写:
那接下来咱们在子类中来重写父类的方法:
看下错误提示:
所以咱们显示的加上override来看下:
所以:
可见在Kotlin中增加了很多的关键字,并非平白无故的就增加了,都是为了语义更加的强而增加的,想一想,在Java中对于父类的重写,如果站在子类的角度是不是很难知道该方法是重写的父类的,排除IDE的提示,但是在Kotlin中,我们只要发现方法中有override,肯定就代码是重写了父类的方法了,语义性特别的强。
接下来继续:
接下来再来定义一个新的class:
属性重写:
错误提示:
一样的处理办法:
接下来使用一下:
另外还有一种重写字段的方法,就是在primary构造当中,如下:
接下来再来定义一个新的class:
再定义子类:
另外有一个细节:
那。。如果反过来定义呢?
这个报错是因为得再定义一个set方法才行,如下:
那么问题来了,为啥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方法