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