接口是用于实现多态编程的重要组成部分。我们都知道,Java是单继承结构的语言,任何一个类最多只能继承一个父类,但是却可以实现任意多个接口,Kotlin也是如此。
首先创建一个Study
接口,在创建文件窗口选择“Interface”。
然后在Study
接口中添加几个学习相关的函数,注意接口中的函数不要求有函数体,代码如下所示:
然后在Student类中,实现这个接口使用冒号,如果有继承父类,就使用逗号隔开就可以,如图:
实现接口后,会强制实现接口中的方法,我们在实现的方法中打印两句话,然后在main()函数中调用一下,如图:
运行结果如图:
这样我们就将Kotlin中接口的用法基本学完了,是不是很简单?不过为了让接口的功能更加灵活,Kotlin还增加了一个额外的功能:允许对接口中定义的函数进行默认实现。其实Java在JDK 1.8之后也开始支持这个功能了,因此总体来说,Kotlin和Java在接口方面的功能仍然是一模一样的。
下面我们学习一下如何对接口中的函数进行默认实现,修改Study
接口中的代码,如下所示:
然后删除Student中的doHomework函数,发现也不会报错,然后我们运行main函数,如图:
现在你已经掌握了Kotlin面向对象编程中最主要的一些内容,接下来我们再学习一个和Java相比变化比较大的部分——函数的可见性修饰符。
熟悉Java的人一定知道,Java中有public
、private
、protected
和default
(什么都不写)这4种函数可见性修饰符。Kotlin中也有4种,分别是public
、private
、protected
和internal
,需要使用哪种修饰符时,直接定义在fun
关键字的前面即可。下面我详细介绍一下Java和Kotlin中这些函数可见性修饰符的异同。
首先private
修饰符在两种语言中的作用是一模一样的,都表示只对当前类内部可见。public
修饰符的作用虽然也是一致的,表示对所有类都可见,但是在Kotlin中public
修饰符是默认项,而在Java中default
才是默认项。前面我们定义了那么多的函数,都没有加任何的修饰符,所以它们默认都是public
的。protected
关键字在Java中表示对当前类、子类和同一包路径下的类可见,在Kotlin中则表示只对当前类和子类可见。Kotlin抛弃了Java中的default
可见性(同一包路径下的类可见),引入了一种新的可见性概念,只对同一模块中的类可见,使用的是internal
修饰符。比如我们开发了一个模块给别人使用,但是有一些函数只允许在模块内部调用,不想暴露给外部,就可以将这些函数声明成internal
。关于模块开发的内容,我们会在本书的最后一章学习。
表2.2更直观地对比了Java和Kotlin中函数可见性修饰符之间的区别。
表2.2 Java和Kotlin函数可见性修饰符对照表
修饰符 | Java | Kotlin |
---|---|---|
| 所有类可见 | 所有类可见(默认) |
| 当前类可见 | 当前类可见 |
| 当前类、子类、同一包路径下的类可见 | 当前类、子类可见 |
| 同一包路径下的类可见(默认) | 无 |
| 无 | 同一模块中的类可见 |