接口

接口可以拥有实现

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 静态初始化的。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐