Kotlin學習(二)數組

數組

數組用類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
    }
}
發佈了15 篇原創文章 · 獲贊 7 · 訪問量 2999
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章