Kotlin笔记(五)——继承

来源:互联网 发布:炫浪网络社区下载不了 编辑:程序博客网 时间:2024/06/05 11:59

Kotlin的所有类默认继承自Any类,也就是说Any类是Kotlin所有类的公共基类。Any与Java的Object类不同,它只提供了equals(),toString()和hasCode()三个方法,如果需要扩展Any类,可以使用扩展方法,后面文章会有说明。


Kotlin的类默认是不可被继承的,也就是默认不可以作为其他类的基类,如果希望一个类可以被继承,需要使用open关键字,下面看一个例子:

open class Base1class Derived1 : Base1()

如果基类有首要构造器,比如上面的Base,派生类可以直接采用上面的方式调用基类的构造器对基类进行初始化,下面看一个复杂一些的例子:

open class Base2(aFloat: Float) {    constructor(aFloat: Float, aInt: Int) : this(aFloat)}class Derived2(aFloat: Float, aInt: Int) : Base2(aFloat, aInt)

Base2有两个构造器,一个是首要构造器,需要一个Float值作为参数,另一个是次要构造器,需要一个Float和一个Int做参数,次要构造器需要调用主要构造器,我们这里通过this调用了主要构造器,this代表当前实例化的类对象。


Derived2类有一个首要构造器,需要一个Float和一个Int做参数,但是他调用了基类的次要构造器进行基类的初始化。


总结一下,关于类的构造及其派生类的构造,个人认为主要注意以下几点:

  1. 尽可能为每个类提供首要构造器,如果不提供构造器,则Kotlin会为我们自动生成一个默认的无参首要构造器;

  2. 次要构造器一定要调用首要构造器;

  3. 派生类定义构造器,记得调用基类的构造器完成基类的初始化


Kotlin提供了抽象类,抽象类就是无法实例化的类,我们的基类可以定义为抽象类,抽象类默认是open的,因为它无法被实例化,只能寄希望于被其他类派生才能被使用,抽象类中可以定义抽象方法,抽象方法不能定义函数体,如果有抽象方法,子类必须重写实现,看下面的例子:

abstract class AbstractClass {    abstract fun aAbstractFunction()    fun aFunction() {        println("I am not a abstract function")    }}class DerivedFromAbstractClass : AbstractClass() {    override fun aAbstractFunction() {        println("I am a abstract function in child class")    }}

Kotlin还有interface,interface和抽象类的差别在于,interface中的方法都是抽象方法,但是这些抽象方法可以提供函数体,interface也可以定义属性,但是这些属性没有初始值,以后的文章会详细介绍属性。看一个例子

interface AInterface {    val aAbstractProperty: Int    val aProperty: Int        get() = aProperty    fun aFunction()    fun aFunctionWithBody() {        println("interface function body")    }}class DerivedFromInterface : AInterface {    override val aAbstractProperty: Int = 20    override val aProperty: Int = 0    override fun aFunction() {        println("aFunction")    }}

注意一些差别,interface没有构造器,所以派生interface不需要在其后调用interface的构造器,所以上例中AInterface后没有(),另外,我们在派生类初始化了两个属性,实现了一个抽象方法。


最后看一下Kotlin的单实例类,单实例类就是我们定义了一个类,但是这个类Kotlin只会为我们生成一个对象,定义单实例类使用object关键字,单实例类也没有构造函数,其他方面和一个普通类类似,看一个例子:

object SingletonClass {    fun say() {        println("I am a Singleton")    }}

调用使用类名.方法或属性名:

SingletonClass.say()