美文网首页Kotlin语言
Kotlin类的继承与重写

Kotlin类的继承与重写

作者: 跳动的字符 | 来源:发表于2018-05-01 17:32 被阅读0次

 Kotlin是一门基于JVM的开发语言,已成为Android官方开发语言已有一段时间了,最近也开始学习Kotlin这门新的语言了,就算不做Android开发,做后端服务开发用Kotlin也是不错的选择,与Java可以100%的进行互操作。今天先写关于Kotlin类的继承与重写,做此笔记,以便以后复习。

  1. 类的继承
  • 在Kotlin中,所有类在默认情况下都是无法被继承的,简而言之,就是说Kotlin中,所有类在默认情况下都是final的,但如何才能被继承,Kotlin给我们提供了一个关键字open,只有被open修饰的类才可以被继承(关键字open的作用与final相反),否则编译器会报错。示例如下:
open class Parent(name: String, age: Int) {
    ......
}

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

class Child2: Parent2 {
    constructor(name: String): super(name) {
        ......
    }
}

也可以这样写:
class Child3(name: String): Parent2(name){
    ......
}
  1. 类的方法重写
  • 在kotlin中,类中的方法也是final类型,是不能被重写的,也需在方法前面加上open关键字后才可以;子类要重写父类中open修饰的方法,需在子类的方法前面加override关键字。如下所示:
open class Color {
    open fun name() {
        println("red")
    }

    fun type() {
        println("7 ColorS")
    }
}

class Blue: Color() {
    override fun name() {
        println("blue")
    }
}
  • 若在父类中方法override前再加上final后,子类中的该方法是不能被重写的,否则编译器会报错。如下所示:
open class Orange: Color() {
    final override fun name() {
        println("orange")
    }
}

如下所示,编译器会报错:'name' in 'Orange' is final and cannot be overridden),
若去掉override,则会报:'name' hides member of supertype 'Orange' and needs 'override' modifier

class SmallOrange: Orange() {
    override fun name() {
        println("small orange")
    }
}

fun main(args: Array<String>) {
    val color = Color();
    println(color.name())
    println(color.type())

    val color1 = Orange();
    println(color1.name())
}

输出结果如下:
blue
7 Colors
orange
  1. 类的属性重写
  • 类前面加open与方法和属性(成员变量)open作用是不一样的,类前加open关键字表示类可以被继承,方法和属性前加open关键字表示方法和属性可以被重写。如下所示:
open class MyParent {
    open val name: String = "parent"
}

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

也可以这样写:
class MyChild2(override val name: String): MyParent() {
    ......
}

fun main(args: Array<String>) {
    val myChild = MyChild()
    println(myChild.name)
}

输出结果如下:
child
  • val与var修饰的属性或成员变量的重写的不同之处:
    • val属性是可以被val的属性所override的;
    • var属性是可以被val属性override的;
    • val属性是不能被var属性所override的。
    • 本质上val相当于get方法,var相当于set与get方法
open class MyParent3 {
    open fun method() {
        println("parent method")
    }

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

class MyChild3: MyParent3() {
    override fun method() {
        super.method()

        println("child method")
    }

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

fun main(args: Array<String>) {
    val myChild3 = MyChild3()
    println(myChild3.method())
    println(myChild3.name)
}

输出结果如下:
parent method
child method
parent and child

好了,今天就写到这里。

相关文章

网友评论

    本文标题:Kotlin类的继承与重写

    本文链接:https://www.haomeiwen.com/subject/nkoahftx.html