kotlin 語法總結(二)

引言

最近項目中開始使用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 方式效率更高。避免方法的頻繁調用。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容