Kotlin从入门到放弃 第六节 接口
Kotlin中接口部分和Java中几乎是完全一致的,所以这节的内容就简单很多。
接口是用于实现多态编程的重要组成部分。我们都知道,Java中是单继承结构的语言,任何一个类最多只能继承一个父类,但是却可以实现任意多个接口,Kotlin也是如此
我们可以在接口中定义一系列抽象行为,然后由具体的类去实现。还是通过代码来学习一下。首先创一个Study接口,并在其中定义几个学习行为。
上面两张图片就是创建接口的步骤。
我们在创建好的接口类中定义两个方法,代码如下:
interface Study {
fun readBooks()
fun doHomeWork()
}
接下来就可以让Student类去实现Study接口了,这里我把Student类原有的代码调整了一下,以突出继承父类和实现接口的区别:
class Student(name: String, age: Int) : Person(name, age), Study{
override fun readBooks() {
Log.i("TAG", name + " is reading")
}
override fun doHomeWork() {
Log.i("TAG", name + " is doing homework")
}
}
熟悉Java的人一定知道,Java中继承的关键字是extends,实现的关键字是implement,但是Kotlin中统一使用冒号,中间使用逗号进行分隔。上面的代码就表示继承Person类实现Study接口。另外,因为接口没有构造函数,所以不需要加括号。
Study接口定义了readBooks() 和 doHomeWork() 两个待实现函数,因此Student类必须实现这两个函数。Kotlin中使用override关键字来重写父类或则接口中的函数,这里我们只是简单的打印两行日志,
现在我们可以在main() 函数中编写代码来调用这两个接口中的函数:
fun main() {
val student = Student("ZhangSan", 22)
doStudy(student)
}
fun doStudy(study: Study) {
study.readBooks()
study.doHomeWork()
}
这里为了想你演示一下多态的编程特性,故意将代码写的复杂了一些,首先创建了一个Student类的实例,本来是可以直接调用readBooks()和doHomeWork()函数的,但是我没有这么做,而是将它传入到了doStudy()函数中。doStudy()函数接收一个Study类型的参数,由于Student类实现的Study接口,因此Student类的实例是可以传递给doStudy()函数的,然后调用了readBooks()和doHomeWork()函数,这种就叫面向接口编程,也叫多态。
OK,Kotlin中接口的基本用法学完了,还是很简单的,不过为了让接口的功能更加灵活,Kotlin中增加了一个额外的功能:允许对接口中定义的函数进行默认实现。其实Java在JDK1.8之后也支持了这个功能,所以总体来说Java和Kotlin在接口方面还是的功能任然还是一模一样的。
默认实现的代码如下:
interface Study {
fun readBooks()
fun doHomeWork() {
Log.i("TAG", "do homework default implementation.")
}
}
可以看到只要给函数加上函数体就是对它进行了默认实现,当它有了默认实现的时候,其他的类在去实现Study接口之后拥有默认实现的函数就不会强制实现,可以选择实现也可以选择不实现,当我们选择不实现的时候,就会运行默认实现的代码。
最后再说一下函数的修饰符。Java中有四种修饰符:public、private、protected和default。Kotlin种也有四种修饰符:public、private、protected和internal。
然后说一下这些修饰符的异同。
首先public和private,Kotlin和Java的用法是一样的,需要注意的是在Kotlin种public是函数的默认项,而在Java种default才是默认项,protected关键字在Java种表示对当前类、子类和同一路径下的类可见,在Kotlin中则表示对当前类和子类可见。Kotlin中抛弃了Java抛弃了default,引入了一种新的概念只对当前模块可见,使用的是internal修饰符。关于模块开发的内容,会在后面提及。