天天看點

Kotlin 模糊知識點

1,as 關鍵字的作用,表示強轉類型,example 打開軟鍵盤的代碼

fun openKeyboard(context: Context, editText: EditText) {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(editText, InputMethodManager.RESULT_SHOWN)
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,            InputMethodManager.HIDE_IMPLICIT_ONLY)
}
           

解釋:注意一點即可以觀察出來,如果不進行強轉,本身預設是 Object 類型,那麼怎麼會有 showSoftInput 方法和 toggleSoftInput 的方法呢。

2,object 關鍵字和 companion object 關鍵字都可以用來實作單例模式。不但如此,object 還常用來實作匿名内部類。

object 可以定義在全局也可以在類的内部使用

object 就是單例模式的化身

object 可以實作 Java 的匿名内部類

companion object 就是 Java 中的 static 變量

companion object 隻能定義在對應的類中

tips:除此之外,除此之外,除此之外

object 可以作為變量的定義也可以是表達式

object 匿名類可以繼承并超越 Java 中匿名類而實作多個接口

object 表達式當場執行個體化,但定義的 object 變量是延遲執行個體化的

object 匿名内部類還可以引用并更改局部變量

companion object 甚至還可以被擴充

object 可以實作 kotlin 的單例模式,可以定義在全局中,也可以定義在類的内部。但是需要注意:

1.object 定義後即刻執行個體化

2.是以 object 不能有定義構造函數

3.定義在類内部的 object 并不能通路類的成員

companion object 的定義完全屬于類的本身,是以 companion object 肯定不能脫離類而定義在全局中。有些像 Java 中的 static 變量。也可以實作接口,因為 companion object 寄生于類,甚至類還可以直接作為相對應的接口的參數形式傳入。

在 Java 中,内部類是不可以通路外部的非 final 成員變量的,也就是說:它不允許更改變量值!但是,kotlin 的 object 可以。

3,var 和 val 的唯一差別是 var 既有 getter 又有 setter,val 隻有 getter 沒有 setter。其中 val 與 Java 中的 final 不完全相同。隻有一種情況他們完全相同,就是像 private val foo = 3 這樣,以 private 修飾,賦予初始值,并且不提供自定義的 getter,不被委托的屬性,這個屬性完全等同于 Java 中的 private final int foo = 3。因為 kotlin 預設是 public 屬性,如果是權限修飾符是 private 的話那麼就不能外部通路,再加上是以 val 修飾的,是以沒有 getter 和 setter 方法。

4,kotlin 中 open 關鍵字什麼時候使用,init 關鍵字什麼時候使用。

Kotlin 類預設是 final,這點可以自己嘗試反編譯下 Kotlin 代碼就可以發現。是以如果你想擴充一個類的話,就必須使用 open 修飾符才行。

Kotlin 中的類可以有一個主構造器,以及一個或多個次構造器,主構造器是類頭部的一部分,位于類名稱之後

class Person constructor(firstName: String) {}
           

一般情況下 constructor 關鍵字可以省略。tips:主構造器中不能包含任何代碼,初始化代碼可以放在初始化代碼段中,使用 init 關鍵字作為字首。

class Person constructor(firstName: String) {
        init {
            System.out.print("FirstName is $firstName")
        }
    }
           

5,kotlin 代碼轉換成 Java 代碼,選擇 tools -> kotlin -> show kotlin bytecode (展示位元組碼檔案)

-> Decompile 即可以顯示出來相對應的 Java 代碼。

6,注意在 kotlin 中之是以可以直接通路屬性名來擷取值就是因為 kotlin 自動生成了 getter 和 setter 方法。