深入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接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )

Kotlin接口和抽象类 ( 接口属性和方法定义 | 接口默认方法实现 | 抽象类 )

快速上手kotlin接口抽象类及泛型

快速上手kotlin接口抽象类及泛型

kotlin中抽象类

kotlin学习总结——类和对象继承接口和抽象类