Kotlin 继承和接口

朴灿烈づ我的快乐病毒、 2022-04-23 13:24 459阅读 0赞

一、Kotlin中类的继承

在Java中,类基于Object,而在Kotlin中类基于Any,所有类都默认继承Any。kotlin中的类默认是final类型的,不可被继承,想要作为基类被继承必须使用open关键字修饰。

对于没有超类型声明的类默认超类是Any,Any类只有三个函数~

  1. package kotlin
  2. public open class Any {
  3. public open operator fun equals(other: Any?): Boolean
  4. public open fun hashCode(): Int
  5. public open fun toString(): String
  6. }

二、子类对构造函数的实现

1.当子类中有构造函数,则基类必须在主构造函数中立即初始化

  1. open class S(name: String, age: Int) { //基类
  2. }
  3. //子类中有构造函数,则基类必须在主构造函数中立即初始化
  4. class SS(var name: String, val age: Int, val score: Int) : S(name, age) {
  5. }
  6. fun main(args: Array<String>) {
  7. val s = SS("Tina", 20, 60)
  8. println("学生名:${s.name}")
  9. println("年龄:${s.age}")
  10. println("成绩:${s.score}")
  11. }
  12. 学生名:Tina
  13. 年龄:20
  14. 成绩:60

2.当子类中没有主构造函数时,则必须每一个次要构造函数或代理另一个构造函数中用 super 关键字初始化基类。初始化基类时,可以使用super来调用基类的不同构造函数。

  1. open class Personal(name: String) {
  2. constructor(name: String, age: Int) : this(name) {
  3. //初始化
  4. println("---基类次级构造函数-----")
  5. }
  6. }
  7. class SrudentImpl : Personal {
  8. constructor(name: String, age: Int, no: String, score: Int, likely: String) : super(name, age) {
  9. println("----- 继承类的次级构造函数 ------")
  10. println("学生名:${name}")
  11. println("年龄:${age}")
  12. println("学生号:${no}")
  13. println("成绩:${score}")
  14. }
  15. }
  16. fun main(args: Array<String>) {
  17. var student = SrudentImpl("Mikle", 18, "12485684", 98, "唱歌")
  18. }
  19. 学生名:Mikle
  20. 年龄:18
  21. 学生号:12485684
  22. 成绩:98

3.方法的重写

基类中,使用fun声明函数时,该函数默认是final修饰的,不能被子类重写。如果允许该函数能被重写,则需手动添加open修饰它,子类复写使用override关键词。

  1. open class D {
  2. open fun study() { //允许子类重写的方法
  3. println("基类DD中定义需被子类重写的方法")
  4. }
  5. }
  6. class DD : D(), F {
  7. override fun study() {
  8. println("子类重写了父类的方法~~~")
  9. super<D>.study()
  10. super<F>.study()
  11. }
  12. }
  13. interface F {
  14. fun study() { //允许子类重写的方法
  15. println("接口F中定义的方法~~")
  16. }
  17. }

4.属性重写:使用override关键字

  1. interface Foo {
  2. val count: Int
  3. }
  4. //属性的复写使用override关键字
  5. class Bar1(override val count: Int) : Foo {}
  6. class Bar2 : Foo {
  7. override var count: Int = 0
  8. }

三、Kotlin中接口的实现

使用关键字interface定义接口,一个类可实现一个或多个接口

  1. interface MyInterface {
  2. val name:String //接口中的属性只能是抽象的,不允许初始化值,实现接口,必须重写属性
  3. fun bar()
  4. fun foo()
  5. }
  6. class Child: MyInterface {
  7. override var name:String="我是复写的name属性" //重写属性
  8. override fun foo() {
  9. println("调用了foo方法")
  10. }
  11. override fun bar() {
  12. println("调用了bar方法")
  13. }
  14. }
  15. fun main(args: Array<String>) {
  16. val c = Child()
  17. c.foo()
  18. c.bar()
  19. println(c.name)
  20. }
  21. 调用了foo方法
  22. 调用了bar方法
  23. 我是复写的name属性

***当实现多个接口时,可能会遇到同一方法继承多个实现的问题。

  1. interface A {
  2. fun foo() {
  3. println("A")
  4. } //有方法体,代表已经实现
  5. fun bar() //无方法体,是抽象的,未实现,需要被子类重写
  6. }
  7. interface B {
  8. fun foo() {
  9. println("B") //已实现
  10. }
  11. fun bar() {
  12. println("bar") //已实现
  13. }
  14. }
  15. class C : A {
  16. override fun bar() {
  17. }
  18. }
  19. class H : A, B {
  20. override fun bar() {
  21. super<B>.bar()
  22. }
  23. override fun foo() {
  24. super<A>.foo()
  25. super<B>.foo()
  26. }
  27. }
  28. fun main(args: Array<String>) {
  29. val h=H()
  30. h.foo()
  31. h.bar()
  32. }
  33. 调用了foo方法
  34. 调用了bar方法
  35. 我是复写的name属性

发表评论

表情:
评论列表 (有 0 条评论,459人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Kotlin 继承

    一、 1.继承 父类需要open才可以被继承 父类方法、属性需要open才可以被覆写 接口、接口方法、抽象类默认都是open 覆写父类(接口)成员需要ove

    相关 Kotlin抽象类接口

    一、首先了解一下面向对象的基本概念 1.本质上就是解决如何用程序描述世界的问题 2.讨论如何把实际存在的东西映射成程序的类和对象 3.一种程序设计的思路、思想、方法