今天要介紹一些關於在kotlin中使用建構式與getter、setter用法,十分常見又基本。
fun main(args:Array<String>){
//透過呼叫Dog建構式來實例化成myDog物件
val myDog = Dog("Sam",52)
}
//在建構式直接定義好name與weight等各項"屬性",供呼叫者客製化輸入,
//畢竟每隻狗名字都不同,體重也不同。
class Dog(val name:String,val weight:Int){
//在類別內部才定義的activities屬性。
//因為不管是什麼狗,都會有散步這項activities,這是不變的,所以寫在內部即可。
var activities = arrayOf("walk")
//此為一個初始化區塊 在這個類別Dog被實例化(初始化)的時候會執行
init {
println("Dog $name has been created.")
}
}
class Dog(val name:String,val weight:Int){
var activities = arrayOf("walk")
var age:Int //age屬性沒有初始化,程式無法編譯!!!!
lateinit var color:String //用lateinit就可以先不用給值,但似乎只適用於String,其他如byte、Int、Long、boolean都不行
}
我們知道在函式中宣告的變數都必須先初始化,而在類別中定義屬性也一樣,必須將他們初始化,也就是給他們值啦
class Dog(val name:String,val weight:Int){
val weightInKgs:Double
get() = weight/2.2
}
加入一個weightInKgs屬性與一個getter,來將體重換算成公斤。
class Dog(val name:String,weight_param:Int){
var weight = weight_param
set(value){
if(value>0) field = value
}
}
1.將weight屬性的定義從建構式移到類別裡面
2.這個setter將會在你試著設定weight值的時候被呼叫,例如:
myDog.weight = 75
3.此時會將75傳給setter的value去驗證是否大於0
4.在getter與setter裡用field來取代原屬性名稱(取代weight)可以防止你進入無窮迴圈。
var name:String
當程式碼被編譯時,編譯器會私底下加入getter與setter:
var name:String
get() = field
set(value){
field = field
}