Kotlin的類別和物件

Wed, Nov 10, 2021 閱讀時間 1 分鐘

類別在物件導向就是用程式來模擬描述現實世界中實體的特性(屬性,property)和行為(函數,function),這些實體就是從類別衍生出來的物件,物件就會擁有這個類別的屬性和函數,藉由物件間的互動來完成程式的要求

class Person { /*...*/ }
// 如果沒有主體內容則可以省略大括號
class Empty

在定義類別時會用到建構函數(constructor)來進行物件的初始化,kotlin要產生物件只需要呼叫建構函數,不需要new,kotlin的類別可以有一個主建構函數(primary constructor)和一或多個次級建構函數(secondary constructor),如果沒有提供任何建構函數,則kotlin預設會幫你產生一個public無參數的主建構函數

// 主建構函數寫在類別名稱的後面
// 沒有要加上annotation或存取修飾子就可以省略constructor關鍵字
class Person constructor(firstName: String) { /*...*/ }
class Person(firstName: String) { /*...*/ }
// 這個是加上的例子
class Person public @Inject constructor(firstName: String) { /*...*/ }

fun main() {
    val customer1 = Customer("Ryan ") // 產生物件實體在kotlin沒有new關鍵字
    println("name: ${customer1.name}_Chang") // 可以看到名字尾端空格被去掉才加上姓氏
    println("email: ${customer1.email}") // 主建構函數沒有給email
    val customer2 = Customer("Ryan ", "Ryan_Chang@kotlin.com") // 呼叫次級建構函數來產生物件
    println("name: ${customer2.name}_Chang")
    println("email: ${customer2.email}")
}

// 主建構函數不能包含其它代碼,初始化程式可以寫在init區塊裡
// kotlin提供了一個簡潔語法,在主建構函數可以直接宣告類別屬性並初始化它們
// class Customer(val name: String)等同以下
// 執行順序 1
class Customer(name: String) {
    val name: String
    var email: String = "NONE"

    // 執行順序 2
    init {
        this.name = name.trim()
    }

    // 如果存在主建構函數,次級建構函數就必須先用this去呼叫它
    // 執行順序 3
    constructor(name: String, email: String) : this(name.uppercase()) {
        this.email = email
    }
}