提示:此文章仅作为本人记录日常学习使用,若有存在错误或者不严谨得地方,欢迎各位在评论中指出。
Kotlin语言和Java语言都是单继承结构,即一个类最多只能继承一个父类,但是却可以实现任意多个接口。(注意这里的"最多"代表0个或1个)
我们先来了解一下如何用Kotlin语言声明一个接口。在下面的示例代码中我们声明了一个Study接口和两个方法,它们分别是readBooks()和doHomework()。
interface Study {
fun readBooks()
fun doHomework()
}
接下来我们尝试让Student类继承Person类并实现Study接口,需要注意的是这里的Student类代码与之前的内容并不相同。
继承父类 实现接口
class Student(name: String, age: Int): Person(name, age), Study {
override fun readBooks() {
println(name + "is reading.")
}
override fun doHomework() {
println(name + "is doing homework.")
}
}
在上面的代码中,Student作为子类继承自Person父类,并且实现了Study接口。在Java语言中继承的关键字是extends,而实现接口的关键字是implements。而在Kotlin语言中,类的继承和接口的实现都用冒号:表示,多个接口的实现则用逗号进行分隔。
例如A类继承了B类并实现了C接口:
class A : B(), C {
// ...
}
再例如A类继承了B类并实现了C接口和D接口:
class A : B(), C, D {
// ...
}
某个类一旦实现了一个接口,就需要对该接口中的方法进行实现。在Kotlin语言中使用override关键字来重写父类或者实现接口中的方法。
以下代码用于演示接口的多态性:
fun main(){
val student = Student("Mike", 18)
//因为Student类实现了Study接口 所以Student类的对象也可以作为参数传递给doStudy()方法
doStudy(student)
}
//doStudy()方法要求接收一个Study类型参数
fun doStudy(study: Study){
study.readBooks()
study.doHomework()
}
//运行结果
——> Mike is reading.
——> Mike is doing homework.
其实Student的实例可以直接调用readBooks()和doHomework()的,不过为了演示多态而故意写复杂了一些。
fun main(){
val student = Student("Mike", 18)
student.readBooks()
student.doHomework()
}
//运行结果
——> Mike is reading.
——> Mike is doing homework.
Kotlin为了让接口的使用更加灵活,额外增加一个功能:允许对接口中定义的函数进行默认实现。在下面的代码中我们给Study接口中的doHomework()方法增加了一个方法体,它的功能是打印一句话。如果接口中的一个方法拥有了方法体,那么这个方法体中的内容就是这个方法的默认实现。
interface Study {
fun readBooks()
//默认实现
fun doHomework() {
println("do homework default implementation.")
}
}
当一个类去实现Study接口时,只会强制要求其实现readBooks()方法,而对doHomework()方法则没有要求,你可以选择实现或者不实现该方法。之所以会这样,是因为我们在Study接口中已经为doHomework()方法添加了方法体。当在实现接口的时候,如果你不实现doHomework()方法,则会使用该方法默认的实现逻辑。反之,如果你重新实现了该方法,则不会使用该方法默认的实现逻辑。