天天看點

Kotlin學習之Kotlin 類和屬性Kotlin 類和屬性

Kotlin 類和屬性

類定義

Kotlin 類可以包含:構造函數和初始化代碼塊、函數、屬性、内部類、對象聲明。

Kotlin 中使用關鍵字 class 聲明類,後面緊跟類名:

class Runoob {  // 類名為 Runoob
    // 大括号内是類體構成
}
           

我們也可以定義一個空類:

class Empty
           

可以在類中定義成員函數:

class Runoob() {
    fun foo() { print("Foo") } // 成員函數
}
           

類的屬性

屬性定義

類的屬性可以用關鍵字 var 聲明為可變的,否則使用隻讀關鍵字 val 聲明為不可變。

class Runoob {
    var name: String = ……
    var url: String = ……
    var city: String = ……
}
           

我們可以像使用普通函數那樣使用構造函數建立類執行個體:

要使用一個屬性,隻要用名稱引用它即可

site.name           // 使用 . 号來引用
site.url
           

getter 和 setter

屬性聲明的完整文法:

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]
 
           

getter 和 setter 都是可選

如果屬性類型可以從初始化語句或者類的成員函數中推斷出來,那就可以省去類型,val不允許設定setter函數,因為它是隻讀的。

var allByDefault: Int? // 錯誤: 需要一個初始化語句, 預設實作了 getter 和 setter 方法
var initialized = 1    // 類型為 Int, 預設實作了 getter 和 setter
val simple: Int?       // 類型為 Int ,預設實作 getter ,但必須在構造函數中初始化
val inferredType = 1   // 類型為 Int 類型,預設實作 getter
           

執行個體

以下執行個體定義了一個 Person 類,包含兩個可變變量 lastName 和 no,lastName 修改了 getter 方法,no 修改了 setter 方法。

class Person {

    var lastName: String = "zhang"
        get() = field.toUpperCase()   // 将變量指派後轉換為大寫
        set

    var no: Int = 100
        get() = field 			// 後端變量  因為在kotlin中 no = 會被翻譯成 set() ,在set方法中調用set顯然是不合适的
        set(value) {
            if (value < 10) {       // 如果傳入的值小于 10 傳回該值
                field = value
            } else {
                field = -1         // 如果傳入的值大于等于 10 傳回 -1
            }
        }

    var heiht: Float = 145.4f
        private set
}

// 測試
fun main(args: Array<String>) {
    var person: Person = Person()

    person.lastName = "wang"

    println("lastName:${person.lastName}")

    person.no = 9
    println("no:${person.no}")

    person.no = 20
    println("no:${person.no}")

}
           

輸出結果為:

lastName:WANG
no:9
no:-1
           

Kotlin 中類不能有字段。提供了 Backing Fields(後端變量) 機制,備用字段使用field關鍵字聲明,field 關鍵詞隻能用于屬性的通路器,如以上執行個體:

var no: Int = 100
        get() = field                // 後端變量
        set(value) {
            if (value < 10) {       // 如果傳入的值小于 10 傳回該值
                field = value
            } else {
                field = -1         // 如果傳入的值大于等于 10 傳回 -1
            }
        }
           

非空屬性必須在定義的時候初始化,kotlin提供了一種可以延遲初始化的方案,使用 lateinit 關鍵字描述屬性:

public class MyTest {
    lateinit var subject: TestSubject

    @SetUp fun setup() {
        subject = TestSubject()
    }

    @Test fun test() {
        subject.method()  // dereference directly
    }
}
           
參照 https://www.runoob.com/kotlin/kotlin-class-object.html