6.Kotlin继承与重写重要特性剖析

2017-12-23  本文已影响0人  leofight

1.Kotlin继承

1)在Kotlin中,所有类在默认情况下都是无法被继承的。
2)换句话说,在Kotlin中,所有类默认情况下都是final的。
3)open的含义与final相反。
4)在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过super关键字来初始化类型,或者通过其他secondary构造方法完成这个任务不同的secondary构造方法可以调用父类型不同的构造方法。

//在Kotlin中,所有类在默认情况下都是无法被继承的
//换句话说,在Kotlin中,所有类默认情况下都是final的
//open的含义与final相反
open class Parent(name: String, age: Int) {

}

class Child(name: String, age: Int) : Parent(name, age) {

}

open class Parent2(name: String) {

}

//在Kotlin中,如果一个类没有primary构造方法,那么这个类的每个secondary构造方法就需要通过
//super关键字来初始化类型,或者通过其他secondary构造方法完成这个任务
//不同的secondary构造方法可以调用父类型不同的构造方法
class Child2 : Parent2 {
    constructor(name: String) : super(name) {

    }
}

2.方法重写

在Kotlin中,如果一个子类的某个方法重写了父类中的某个方法,子类方法必须要加上“override”关键字,且父类方法要加上“open”关键字。


open class Fruit {
    open fun name() {
        println("fruit")
    }

    fun expirationDate() {
        println("1 month")
    }
}

class Apple : Fruit() {
    override fun name() {
        println("apple")
    }
}

open class Orange : Fruit() {
    final override fun name() {
        println("orange")
    }
}

fun main(args: Array<String>) {
    var apple = Apple();
    apple.name()
    apple.expirationDate()
}
apple
1 month

3.属性重写

在Kotlin中,如果一个子类的某个属性重写了父类中的某个属性,子类属性必须要加上“override”关键字,且父类属性要加上“open”关键字。

open class MyParent {
    open val name: String = "parent"
}

class MyChild : MyParent() {
    override val name: String = "child"
}

fun main(args: Array<String>) {
    var myChild = MyChild()
    println(myChild.name)
    println("-----------")

    var myChild3 = MyChild3();
    myChild3.method()
    println(myChild3.name)
}

class MyChild2(override val name: String) : MyParent() {

}

open class MyParent3 {
    open fun method() {
        println("parent method")
    }

    open val name: String get() = "parent"
}

//1.val 可以override val
//2. var 可以override val
//3.val 无法override var

//本质上,val相对于get方法;var相对于get于set方法

class MyChild3 : MyParent3() {
    override fun method() {
        super.method()
        println("child method")
    }

    override val name: String
        get() = super.name + "and child"
}
child
-----------
parent method
child method
parentand child

1)val 可以override val
2)var 可以override val
3)val 无法override var
本质上,val相对于get方法;var相对于get与set方法

上一篇 下一篇

猜你喜欢

热点阅读