【深入kotlin】- 接口和抽象类
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 静态初始化的。
更多推荐


所有评论(0)