數組
數組用類Array實現,並且還有一個 size 屬性及 get 和 set 方法,由於使用 [] 重載了 get 和 set 方法,所以我們可以通過下標很方便的獲取、設置數組對應位置的值
數組的兩種創建方式:
1.使用函數arrayOf()
2.使用工廠函數
如下:分別使用了兩種方式創建了兩個數組
fun main(args: Array<String>){
//[1,2,3]
val a = arrayOf(1, 2, 3)
//[0,2,4]
val b = Array(3, { i -> (i * 2) })
//讀取數組內容
println(a[0]) // 輸出結果:1
println(b[1]) // 輸出結果:2
}
如上所述,[] 運算符代表調用成員函數 get() 和 set()。
注意:與Java不同的是,Kotlin 中數組是不型變的(invariant)
除了類Array,還有ByteArray,ShortArray,IntArray等,用來表示各個類型的數組,省去了裝箱操作,因此效率更高,其用法同Array一樣:
val x: IntArray = intArray(1, 2, 3)
x[0] = x[1] + x[2]
類的定義
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 = ....
}
我們可以像使用普通函數那樣使用構造函數創建類實例:
val site = Runoob() //注意:Kotlin 中沒有 new 關鍵字
要使用一個屬性,只要用名稱引用它即可
site.name //使用 . 號來引用
site.url
kotlin 中的類可以有一個主構造器,以及一個或多個次構造器,主構造器是類頭部的一部分,位於類名稱之後:
class Person constructor(firstName: String) {}
如果主構造器沒有任何註解,也沒有任何可見度修飾符,那麼constructor關鍵字可以省略。
class Person(firstName: String){
}
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 // 後端變量
set(value) {
if (value < 10) { // 如果傳入的值小於 10 返回該值
field = value
} else {
field = -1 // 如果傳入的值大於等於 10 返回 -1
}
}
var height: Float = 145.4f
private set//設置其set爲private的
}
// 測試
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
}
}