思维导图|kotlin 继承

大家好,我是青空。今天给大家带来的是kotlin 继承。

图片

文末可领取大厂面试题

所有类都继承 Any 类

Any 不是 java.lang.Object

是所有类的超类

没有超类型声明的类是默认超类

Any 默认提供了三个函数

  • equals()

  • hashCode()

  • toString()

把超类型 放在冒号 之后
open class Base(p: Int)

class Derived(p: Int) : Base(p)

构造函数

子类有主构造函数
  • 必须在主构造函数中立即初始化

  • 即冒号后的结构体必须传值进去

子类没有主构造函数
  • 必须在每一个二级构造函数中用 super 关键字初始化基类

  • 或者在代理另一个构造函数

class Student : Person {

    constructor(ctx: Context) : super(ctx) {
    } 

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
    }
}

Java没有主构造的概念

但Android中View的子类,必须要有一个构造函数

有一点差不多的意思

重写方法

Kotlin 力求清晰显式

  • 加强了继承的限制。也就加强了 类之间的关联界定

使用fun声明函数时,此函数默认为final修饰,不能被子类重写

如果允许子类重写该函数,那么就要手动添加 open 修饰它

子类重写方法使用 override 关键词

跟java的差异

  • 能否被继承需要open关键字标明

  • 默认无法被继承

重写属性

override

这基本跟java一致

kotlin中,override某变量,需要标注override

这也是加强了类继承中,变量重写的界定

总体来说

kotlin较java

kotlin对继承更细化

对继承中,增强 改变的部分 的标注

派生类   初始化顺序

1、父结构体 2、父结构体内参数处理 3、子类 init  & 属性

范例

open class Base(val name: String) {

    open val size: Int = 
        name.length.also { println("Initializing size in Base: $it") }
        
    init { println("Initializing Base"+size) }

}

class Derived(
    name: String,
    val lastName: String
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {

    init { println("Initializing Derived") }

    override val size: Int =
        (super.size + lastName.length).also { println("Initializing size in Derived: $it") }
}
fun main() {
    println("Constructing Derived(\"hello\", \"world\")")
    val d = Derived("hello", "world")
}

输出

Constructing Derived("hello", "world")
Argument for Base: Hello
Initializing size in Base: 5
Initializing Base0
Initializing Derived
Initializing size in Derived: 10

注意
  • 初始化是有顺序的

  • 留意:打印的属性值

  • 看Base中的size值,在init中是无法正确获取的

  • 基类的open属性,不能被构造函数、属性初始化器、init块中使用open成员

调用超类实现

使用 super 关键字

基本与java一致

留意

在一个内部类中访问外部类的超类,可以通过由外部类名限定的 super 关键字来实现:super@Outer

范例

class FilledRectangle: Rectangle() {
    fun draw() { /* …… */ }
    val borderColor: String get() = "black"
    
    inner class Filler {
        fun fill() { /* …… */ }
        fun drawAndFill() {
            super@FilledRectangle.draw() // 调用 Rectangle 的 draw() 实现
            fill()
            println("Drawn a filled rectangle with color ${super@FilledRectangle.borderColor}") // 使用 Rectangle 所实现的 borderColor 的 get()
        }
    }
}

super覆盖规则

一个类继承多个

为了表示采用从哪个超类型继承的实现

  • 由尖括号中超类型名限定的 super,如 super

范例

open class Rectangle {
    open fun draw() { /* …… */ }
}

interface Polygon {
    fun draw() { /* …… */ } // 接口成员默认就是“open”的
}

class Square() : Rectangle(), Polygon {
    // 编译器要求覆盖 draw():
    override fun draw() {
        super<Rectangle>.draw() // 调用 Rectangle.draw()
        super<Polygon>.draw() // 调用 Polygon.draw()
    }
}

最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。

图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值