Kotlin學習總結(一)寫個類

2019.07.01開始上手寫kotlin,每日一更,立個flag

寫一個類

類成員

類能夠包含:
  • 構造函數與初始化塊(總結這部份內容)
  • 函數
  • 屬性
  • 嵌套類與內部類
  • 對象聲明
Kotlin 中使用關鍵字 class 聲明類

class HelloWorld{...}  //最簡單的一個類就OK了,和java差很少的複製代碼
類聲明由類名、類頭(指定其類型參數、主構造函數等)以及由花括號包圍的類體構成。類頭與類體都是可選的; 若是一個類沒有類體,能夠省略花括號。這種就不展現出來了。

構造函數

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

class HelloPeiqiTest constructor(str: String){
    //........
}複製代碼
若是主構造函數沒有任何註解或者可見性修飾符,能夠省略這個 constructor 關鍵字。

class HelloPeiqiTest(str: String){
    //........
}複製代碼
主構造函數不能包含任何的代碼。初始化的代碼能夠放到以 init 關鍵字做爲前綴的初始化塊(initializer blocks)中。在實例初始化期間,初始化塊按照它們出如今類體中的順序執行,與屬性初始化器交織在一塊兒:

class HelloPeiqiTest constructor(string: String){
    var str="nihao"
    init {
        println("HelloPeiqiTest-init1")
    }
    var num:Int=21
    init {
        println("HelloPeiqiTest-init2")
    }
    init {
        println("HelloPeiqiTest-init3")
    }
}複製代碼
主構造的參數能夠在初始化塊中使用。它們也能夠在類體內聲明的屬性初始化器中使用

class HelloPeiqiTest(name: String){
    var str="nihao"+name.toUpperCase()
}複製代碼

與普通屬性同樣,主構造函數中聲明的屬性能夠是可變的(var)或只讀的(val)。
若是構造函數有註解或可見性修飾符,這個 constructor 關鍵字是必需的,而且這些修飾符在它前面:

class HelloPeiqiTest private constructor(val name: String,val num:Int){
    init {
        println("HelloPeiqiTest-init1")
    }
}
複製代碼

次構造函數

類也能夠聲明前綴有 constructor的次構造函數:

class HelloPeiqiTest{
    constructor(name:String){
        println(name)
    }
    init {
        println("HelloPeiqiTest-init1")
    }
}複製代碼
若是類有一個主構造函數,每一個次構造函數須要委託給主構造函數, 能夠直接委託或者經過別的次構造函數間接委託。委託到同一個類的另外一個構造函數用 this 關鍵字便可:

class HelloPeiqiTest(age:Int) {
    constructor(name:String,twoAge:Int):this(twoAge){
        println(name)
    }
    init {
        println("HelloPeiqiTest-init1")
    }
}複製代碼
請注意,初始化塊中的代碼實際上會成爲主構造函數的一部分。委託給主構造函數會做爲次構造函數的第一條語句,所以全部初始化塊中的代碼都會在次構造函數體以前執行。即便該類沒有主構造函數,這種委託仍會隱式發生,而且仍會執行初始化塊:

class HelloPeiqiTest(age:Int) {
    constructor(name:String,twoAge:Int):this(twoAge){
        println(name)
    }
    init {
        //會先執行這個代碼,再執行上面的println(name)
        println("HelloPeiqiTest-init1")
    }
}複製代碼

若是一個非抽象類沒有聲明任何(主或次)構造函數,它會有一個生成的不帶參數的主構造函數。構造函數的可見性是 public。若是你不但願你的類有一個公有構造函數,你須要聲明一個帶有非默承認見性的空的主構造函數:

class HelloPeiqiTest private constructor {
    // 有一個生成的不帶參數的主構造函數,默認的可見性是public,就是什麼都不寫。
    init {
        println("HelloPeiqiTest-init1")
    }
}複製代碼
注意:在 JVM 上,若是主構造函數的全部的參數都有默認值,編譯器會生成 一個額外的無參構造函數,它將使用默認值。這使得 Kotlin 更易於使用像 Jackson 或者 JPA 這樣的經過無參構造函數建立類的實例的庫。

class HelloPeiqiTest(age:Int=12) {
    init {
        println("HelloPeiqiTest-init1")
    }
}複製代碼
建立類的實例
要建立一個類的實例,咱們就像普通函數同樣調用構造函數,注意 Kotlin 並無 new 關鍵字。

fun main(args: Array<String>) {
    println("------------start----------")
    var mHelloPeiqiTest= HelloPeiqiTest()
    println("------------stop----------")
}
class HelloPeiqiTest(age:Int=12) {
    init {
        println("HelloPeiqiTest-init-$age")
    }
}複製代碼
運行結果:

------------start----------
HelloPeiqiTest-init-12
------------stop----------複製代碼
總結
類這部分主要講的就是如何去建立一個類,覺得其初始化方法和構造函數,分爲主構造函數和次函數,總體寫法和java仍是有殊途同歸之處,須要細細安裝教程去寫一次差很少都能理解能明白了,難點主要就在於次構造函數委託主構造函數的理解.
相關文章
相關標籤/搜索