Kotlin抽象类、接口

本文探讨了Kotlin中的抽象类和接口。抽象类不可实例化,包含抽象属性和函数,子类必须实现这些成员并使用`override`关键字。`open`关键字允许子类重写默认final的函数。接口则不能实例化,类可以实现多个接口,并且Kotlin接口可包含默认实现。示例展示了如何定义和使用抽象类及接口。

目录

抽象类、抽象成员

接口


Kotlin中的抽象类和接口的机制与Java相似。

抽象类、抽象成员

抽象类是不能实例化的,只能实现它的继承子类(只能是非抽象的)。

抽象类可以包含抽象的 属性 和 抽象的函数,需要使用 abstract 关键字修饰。
其子类中实现这些抽象的 属性 和 函数 成员的都必须使用 override 关键字修饰。

抽象类中可以带实现的函数,该函数可以在所有子类中都能被直接调用,
并且该函数是默认为 final,不可以被覆盖重写的,
如果要开放给子类重新实现这个函数,可以在该方法前面加上 open 关键字。

abstract class Shape {
    // 抽象类所包含的抽象 属性 和 函数,使用 abstract 关键字修饰。
    abstract var width: Double
    abstract var height: Double
    abstract var radius: Double
    abstract fun area(): Double
    open fun onClick(): Unit { // open 关键字,将该函数开放给子类重新实现这个函数
        println("I'm clicked !")
    }
}

class Rectangle(override var width: Double, override var height: Double) : Shape() {
    // 子类中继承这些 属性 和 函数 的成员都必须使用 override 关键字修饰
    override var radius: Double = width/2

    override fun area(): Double {
        return height * width
    }
}

class Circle(override var radius: Double): Shape() { // 继承Shape抽象类
    override var width: Double = radius *2
    override var height: Double = radius *2
    override fun area(): Double {
        return 3.14 * radius *radius
    }
    override fun onClick() {
        println("Circle is clicked~")
    }
}

fun testShape(): Unit {
    val rect = Rectangle(2.0,5.2)
    println("rect area= ${rect.area()}, r = ${rect.radius}")
    rect.onClick()
    val c = Circle(5.8)
    println("c area= ${c.area()}, r = ${c.radius}, w= ${c.width}")
    c.onClick()
}
  • 子类能够继承父类的 public和protected 成员变量,不能继承父类的 private 成员变量;
  • 同名变量。如果子类中出现了同名的成员变量,那么子类的成员变量会屏蔽掉父类的同名成员变量,即发生隐藏现象。 在子类中访问父类的同名变量,需要使用 super 关键字进行引用。

接口

  • 接口本身不能实例化,只能实例化它的实现类。
  • 一个类可以实现多个接口。
  • 接口是没有构造函数的,使用“:”操作符来实现一个接口,多个接口之间使用“,”操作符连接。
  • Kotlin的接口可以包含抽象方法和 方法的实现
interface IServe {
    val name:String
    val id:Int
    fun save(msg:String) // 抽象方法
    fun prints(): Unit { // 方法的实现
        println("I'm service  $name")
    }
}

class MyServe : IServe {
    override val name: String
        get() = "My_007_Serve"
    override val id: Int
        get() = 7

    override fun save(msg: String) {
        super.prints()
        println("save message:$msg")
    }
}

fun testIServe(): Unit {
    val ms = MyServe()
    ms.save("[test data]")
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值