Kotlin学习(四) --继承

类的继承

这段时间刚从医院回来,,,又过年,就拖到现在才写这里的知识点emmmmmmm尴尬了,总的来说java和kotlin的继承还是蛮像的,就是个别地方有需要主要的地方

超类

超类就是所有的类都继承它,在java中超类是object类,在kotlin里面超类是Any这个就蛮有意思的哈

public open class Any {

    // 比较
    public open operator fun equals(other: Any?): Boolean

    // hashCode()方法:其作用是返回该对象的哈希值
    public open fun hashCode(): Int

    // toString()方法
    public open fun toString(): String
}

这里面看到了Any就三个方法,至于open修饰的问题下面会讲

继承的基本定义+要求

继承就是一个类继承另一个类的方法,变量 然后可以重写,覆盖继承类的方法和变量等等
B类继承A类 就是说A是父类 B是子类
写法: class B : A{} 就是用个:这个符号表示继承
要求
A类必须要用open修饰 要继承的方法和变量必须也要用open修饰
在这里要注意只要你不写open修饰默认都是不能继承的

open class jcDome{
    open var name = "猪猪"
    open var age  = 16
    open fun play(){
        println("玩耍")
    }
    open fun eat(){
        println("吃饭")
    }
}

class Dome : jcDome(){

}

fun main(args: Array<String>) {
    var s = Dome()
    println(s.age)
    s.eat()
    s.play()
}

继承的构造函数问题

当B无主构造函数的时候

当实现类无主构造函数时,则每个辅助构造函数必须使用super关键字初始化基类型,或者委托给另一个构造函数。 请注意,在这种情况下,不同的辅助构造函数可以调用基类型的不同构造函数

class MyView : View(){

    constructor(context: Context) : super(context)

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int)
        : super(context, attrs, defStyleAttr)
}

当B有主构造函数的时候

当存在主构造函数时,主构造函数一般实现基类型中参数最多的构造函数,参数少的构造函数则用this关键字引用即可了

class MyView(context: Context?, attrs: AttributeSet?, defStyleAttr: Int)
    : View(context, attrs, defStyleAttr) {

    constructor(context: Context?) : this(context,null,0)

    constructor(context: Context?,attrs: AttributeSet?) : this(context,attrs,0)
}

重载和重写

重载就是多态性的表现,意思是函数名字一样但是参数不一样,根据不同的参数类型然后用不同的函数
重写就是将父类中的方法重写一遍

重写

用关键词over

open class jcDome{
    open var name = "猪猪"
    open var age  = 16
    open fun play(){
        println("玩耍")
    }
    open fun eat(){
        println("吃饭")
    }
}

class Dome : jcDome(){
    override fun eat(){
        println("吃饭饭")
    }
}

fun main(args: Array<String>) {
    var s = Dome()
    println(s.age)
    s.eat()
    s.play()
}

输出结果是:
16
吃饭饭
玩耍

注意的地方是
1.当父类中的函数,没有用open修饰符修饰的时候,子类中出现的函数的函数名不能与基类中没有用open修饰符修饰的函数的函数名相同,不管实现类中的该函数有无override修饰符修饰。
2当一个类不是用open修饰符修饰时,这个类默认是final的。
3当一个子去继承另外一个父类时,第二个基类不想去覆盖掉第一个基类的方法时,第二个基类的该方法使用final修饰符修饰。

重载

就是同一个方法名但是参数不一样 就是多态

open class jcDome{
    open fun eat(){
        println("吃饭")
    }
}

class Dome : jcDome(){
    fun eat(s:String){
        println("${s}吃饭饭")
    }

}

fun main(args: Array<String>) {
    var s = Dome()
    s.eat()
    s.eat("笑笑")
}

运行结果:
吃饭
笑笑吃饭饭
跟java差不多。。。。

总结

类的继承相关知识思想都是和java一样的,就是有的小地方有区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值