一、初始化類:主構造方法和初始化語句塊
通常來講,類的所有聲明應該在花括号裡面。這裡面被括号括起來的叫主構造方法
主構造方法主要目的:
- 1.表明構造函數參數;
- 2.定義使用這些參數初始化屬性
讓我們來揭示他的工作原理:
class Animal constructor(_name: String) {//帶一個參數的主構造函數
val name: String
init {//初始化函數
name = _name
}
}
在上面的代碼中,可以看到兩個新的kotlin關鍵字:constructor&init。
constructor關鍵字用開始一個構造方法的聲明。
init關鍵字用來引入一個初始化語句塊,并會與主構造方法一起使用。因為主構造語句有文法限制,不能包含初始化代碼,這就是為什麼使用初始化語句塊的原因。
在這個例子中,不需要把初始化代碼放在初始化語句塊中,因為他可以和name屬性結合。如果主構造沒有注解或可見性修飾符,同樣可以将constructor關鍵字省略。
是以簡化後的代碼如下
class Animal(_name: String) {//帶一個參數的主構造
val name = _name//用參數來初始化屬性
}
這就是聲明同樣的類的另一種方法。如果屬性可以通過構造方法初始化,代碼可以通過吧val關鍵字加到構造方法參數之前的方式來簡化。
這樣就可以簡化成如下代碼:
構造參數也可以想函數一樣生命一個預設值:
class Animal(var _name: String, var age : Int = 3)
fun main() {
Animal("lynnlee", 2)
Animal(name = "lynnlee", age = 2)//命名參數
Animal("lynnlee")//第二個參數使用預設值3
}
如果你的類具有一個父類,主構造方法同樣需要初始化父類。
open class Animal(var name: String, var age: Int = 3)
class Cat(name: String) : Animal(name)//Cat聲明主構造參數不要var/val,因為是父類的屬性,不需要setter&getter
fun main() {
Cat("temo")
}
如果繼承了Animal類,必須顯示地調用父類的構造方法,即使他沒有任何參數,這就是為什麼在父類後買你還帶一個括号的原因。注意和接口的差別,接口沒有構造,是以不需要跟括号。
open class Animal
class Cat : Animal()//必須帶口号
如果你要確定你的類不會被别人執行個體化,必須把構造方法标記為private。
class Animal private constructor()
fun main() {
Animal()//報錯,無法執行個體化
}