1. 程式人生 > >Kotlin類與繼承

Kotlin類與繼承

kotlin

Kotlin使用class關鍵字聲明類,類聲明由類名、類頭(指定其類型參數、主 構造函數等)和由大括號包圍的類體組成。

類頭和類體都是可選的,如果一個類沒有類體大括號可省略

class NoBody


類的構造函數

一類可以有一個主構造函數和一個或多個次構造函數。主構造函數是類頭的一部分:它跟在類名(和可選的類型參數)後

主構造函數不能包含任何代碼塊,可用init塊初始化代碼,並且可訪問主構造函數的參數

class Person constructor(firstName: String) {
    init {
        println(firstName)
    }
}

如果類頭沒有任何註解或者可見性修飾符,constructor關鍵字可省略

class Person2(firstName: String) {
    init {
        println(firstName)
    }
}

如果構造函數有註解或可見性修飾符,這個constructor關鍵字是必需的,並且這些修飾符在它前面

class Person3 public constructor(firstName: String) {
    init {
        println(firstName)
    }
}


次構造函數

類也可以聲明次構造函數

class Animal {
    constructor(name: String) {
        println(name)
    }
}

如果一個類有主構造函數,每個次構造函數都需要委托給主構造函數,可以直接委托或者通過其它次構造函數間接委托

使用this關鍵字直接委托給當前類的主構造函數

class Animal2(name: String) {
    constructor(name: String, age: Int) : this(name) {
        println(name + age)
    }

    init {
        println(name)
    }
}

如果一非抽象類沒有任何主或者次構造函數,它會默認生成一個不帶參的主構造函數

class Animal3 {}

等同於

class Animal3(){}

將構造函數用private修飾可以防止被創建類的實例

class DontCreate private constructor() {}


創建類的實例

類定義後,需要創建實例才能使用

fun main(args: Array<String>) {
    //實例化,Kotlin類的實例化省去了new關鍵字
    var person = Person("zhangsna")
    var person1 = Animal3()

    println(person)
    println(person1)

    //private修飾符修飾的構造方法不能實例化
    //var dontCreate = DontCreate()
}


繼承

Kotlin和Java一樣都有隱式繼承,Java中一個類如果沒有顯示的繼承一個類默認繼承Object

而Kotlin中默認繼承Any

class Example  //隱式繼承Any

Any中只有 equals()、hashCode()和toString()三個方法。附Any類源碼圖

技術分享

在Kotlin中所有的類默認為final類型,是不能夠被繼承的。如果該類需要被繼承則必須加上open關鍵字否則該類編譯成class後是一個final類

open class Base {
}

使用:符號實現繼承,繼承的父類必須初始化

class Car : Base() {
}

如果父類主構造函數有參數子類必須聲明一個有參數的主構造函數初始化父類的構造函數

open class Device(name: String) {
    init {
        println(name)
    }
}

class Phone(name: String) : Device(name) {
}

如果父類沒有主構造函數,那麽子類每個次構造函數都必須使用super關鍵字調初始化父類次構造函數

open class Device2 {
    constructor(name: String) {
        println(name)
    }

    constructor(type: Int, weight: Int) {
        println("$type" + weight)
    }
}

class Computor : Device2 {
    constructor(name: String) : super(name)
    constructor(type: Int, weight: Int) : super(type, weight)
}


覆蓋方法和屬性

Kotlin中需要overried關鍵字顯示的覆蓋成員

open class Father {
    open var a: Int = 1
    open fun say() {
        println("father say")
    }
}

class Son : Father() {
    //必須加上overried關鍵字,覆蓋父類成員
    override var a: Int = 2

    override fun say() {
        println("son say")
    }
}


抽象類和繼承

使用abstract關鍵字定義抽象類

abstract class Abstract {
    //定義抽象方法時,必能有方法體
    abstract fun absFun()
}
class Sub : Abstract() {
    //子類必須實現父類的抽象方法
    override fun absFun() {
        println("absFun of sub")
    }
}


本文出自 “love_programme-love_life” 博客,請務必保留此出處http://codemcx.blog.51cto.com/9638142/1979123

Kotlin類與繼承