深入kotlin- 接口和抽象类
Posted 颐和园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入kotlin- 接口和抽象类相关的知识,希望对你有一定的参考价值。
接口
接口可以拥有实现
jdk8 开始,接口中的方法可以拥有方法实现(default关键字修饰的接口方法)。Kotlin 也是同样的:
interface A
fun method()
println("A")
如果一个类 B 继承了接口 A,因为 A 中的方法已经有默认实现,则 B 不需要实现接口 A:
class B: A
重写接口方法
如果需要重写接口方法,则需要 override :
class B: A
override fun method()
super.method()
多继承
类 B 在重写 method 方法时,通过 super.method() 的方式调用了从父接口继承来的 method 方法。现在的问题是,如果多继承怎么办?我们知道,kotlin 允许多继承,即一个类在继承了一个父类的同时,还可以继承(实现)1个到多个接口,那么这个 super 到底指的是哪一个父类(父接口)呢?
假设类 B 多继承 A 和 C,需要在 super 后以范型约束的形式指明具体是那个父接口/父类:
open class C
open fun method()
println("C")
class B: A, C()
override fun method()
super<A>.method()
super<C>.method()
println("B")
super.method 调用的是父接口 A 的 method,super.method 调用的是父类 C 的 method。
抽象类
将父类方法抽象
如果一个子类是抽象类,它可以重写父类的非抽象方法为抽象方法:
open class A
open fun method()
abstract class B: A
override abstract fun method()
object class 对象类
kotlin 中,对象可以脱离类而存在,对象类的声明使用 object class。对象类也是一种类,可以拥有方法和属性:
object MyObject
func method()
println("method")
唯一不同的就是,object 不需要实例化就能够直接使用,因为它本就是一个已经存在的对象:
MyObject.method()
实现接口
可以让对象(而非类)实现接口:
object MyObject: WindowListener ...
对象 VS 对象表达式
- 对象表达式是立即执行的,即它是立即初始化的,对象是延迟初始化的, 即在第一次访问时初始化。
- 伴生对象时在宿主类被加载时被初始化的,即 JVM 静态初始化的。
以上是关于深入kotlin- 接口和抽象类的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )