引言
最近項目中開始使用Kotlin 語言,想掌握的更好只好看kotlin 官網文檔。今天主要看類與對象模塊。
類及一些使用語法
一、同java 一樣,通過class 關鍵字來聲明
二、創(chuàng)建對象:是沒有new 關鍵字,直接用--> class(),class 是我定義的類。
三、構造函數(shù),一個類有一個主構造函數(shù)和可以有多個次級構造函數(shù),主構造函數(shù)是類頭的一部分,放在類名之后。如果類沒有注解或者可見修飾符,那么constructor可以省略。
四、注意:主構造函數(shù)中的屬性,可以在初始化塊中使用和類體內聲明的屬性的初始化器中使用。
五、在次級構造函數(shù)中,如果要委托到一個類中的另一個構造函數(shù),用 this關鍵字,(我在自定義dialog 時候用到過,自定義控件中應該能經常用到)
六、注意點:初始化塊中代碼和初始化器中的代碼是在次級構造函數(shù)之前調用的。
七、kotlin 中所有類有一個超類,Any,類似于java 中的Object類
八、kotlin 類一般都是final,如果要使用其可以被繼承,用關鍵字 open 來修飾。
九、密封類:在類名程前添加 修飾符sealed,其子類和其必須在一個文件中。
范型特點總結:
范型:參數(shù)化類型,故名思意,就是對參數(shù)類型進行一個靈活定義,減少重復代碼量,解除與實際類型的定向綁定,達到解耦,在編譯階段就就會提示,在代碼中類型進行強轉,如果類型轉換是錯誤的,編譯時不會提示,在運行的時候才會提示,用范型在編譯階段就會提示,增加了代碼的安全性,并且代碼清晰,容易閱讀。
注意點:一個方法是不是范型和其所在的類是不是范型沒有關系。
類型參數(shù)限定: 分為上界 和下界,上界用extends關鍵字來來實現(xiàn),下界是用 super 關鍵字來實現(xiàn)。
lateinit 和 lazy 延遲初始化區(qū)別
一、lateinit 只用于變量var ,lazy 只用于常量val ,
二、lazy 應用于單單例模式,而且當且僅當變量第一次調用的時候 委托才會被調用。第一調用的時候是執(zhí)行表達式并記錄結果,第二次調用直接讀取結果。
lateinit 只能用于聲明周期內參數(shù)獲取或初始化。
kotlin const val 和 val 區(qū)別:
const 必須修飾val
const 只允許在top-level級別和object中聲明,使用方式如下
打開Android studio 點擊 Tools->Kotlin->Show Kotlin ByteCode,通過查看字節(jié) 碼,可以看到生成的代碼的區(qū)別如下:
// class version 50.0 (50)
// access flags 0x31
public final class com/example/kotlin/myObject {
// access flags 0x19
public final static Ljava/lang/String; constObject = "constObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x1A
private final static Ljava/lang/String; normalObject = "normalObject"
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x11
public final getNormalObject()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 144 L0
GETSTATIC com/example/kotlin/myObject.normalObject : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/example/kotlin/myObject; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
......
總結:從字節(jié)碼我們可以看到const val 和val修飾對象的主要區(qū)別是:
const val 可見性為public final static,可以直接訪問。
val 可見性為private final static,并且val 會生成方法getNormalObject(),通過方法調用訪問。
如果定義常量時候,用const val 方式效率更高。避免方法的頻繁調用。