Kotlin 與Java的一些區別,open\final\abstract\val\const等

目錄

前言

 1、final的作用

 3、在Kotlin中,類默認都是final的

4、在kotlin中,abstract的用法幾乎和Java一致

5、在Kotlin中,接口默認都是open

6、val和var 的區別

7、const val 

8、const val和val區別:


前言

這篇書寫風格可能比較簡單,只作爲Kotlin與Java在語言,在使用中的一些區別。

 


 1、final的作用

final關鍵字可用於修飾類、屬性和方法,表示它所修飾的類、屬性和方法不可改變。

 


 2、Kotlin與JAVA的一個重大區別

Kotlin的 final 修飾符不能修飾局部變量。

Kotlin的 open 也不能修飾局部變量。

 


 3、在Kotlin中,類默認都是final的

如果你需要允許它可以被繼承,那麼你需要使用open聲明:

open class People: Speakable{//這個類具有`open`屬性,可以被其他類繼承
 
    override fun say() {} //`open`的方法被實現和覆寫,該方法也是`open`的

    fun sayHello() {}    //`final`屬性的方法,不可被覆寫
   
    open fun sayName() {} //`open`屬性的方法,可以被繼承和覆寫
}

  當然,你也可以阻止某些方法被覆寫:


open class People: Speakable{
    //`final`修飾一個原本具有`open`屬性的方法,使其變得不可再被覆寫
    final override fun say() {}
}

 


 

4、在kotlin中,abstract的用法幾乎和Java一致

當你使用abstract修飾符的時候,可以忽略open修飾符,因爲被abstract修飾的類默認具有open屬性。

修飾符 特性 註解
final 不能被覆寫 kotlin中默認所有的方法和類都是final屬性
open 可以被覆寫 需要被明確指出
abstract 必須被覆寫 不能被實例化,默認具有open屬性。
override

覆寫超類的方法

如果沒有被指定爲final,則默認具有open屬性

 


5、在Kotlin中,接口默認都是open

對於接口類來說,基本用不上fianlopenabstract。

因爲接口類默認是open,且不能被聲明爲final。

如果接口實現類的方法沒有函數體,那麼其爲abstract,但是不需要你明確指出他是abstract的。

 


6、val和var 的區別

var爲可變變量,即可以通過重新賦值來改變其內容的變量,與java中傳統的聲明變量方式基本一致。

val爲只讀變量,可以將它理解爲java變量常用修飾符中的final,在初始化的時候需要賦值,且不能被修改。

其中,var 在kotlin裏面你可以指明屬性的數據類型,也可以不指明屬性的數據類型, kotlin可以很智能的幫你區別這個屬性的值。

var value1 = 10  // Kotlin自動進行標識

val value2: Long = 10  

val value3: Long = value1 //error   

請注意,當Kotlin同樣會有類型轉換錯誤,在Kotlin中轉換是通過顯式進行的,即通過使用輔助函數完成的。 


val value3: Long = value1.toLong() 

 


7、const val 

Kotlin提供了const用來修飾可執行“宏替換”的常量。這種常量也被稱爲“編譯時”常量,因爲它在編譯階段就會被替換掉。const使用時滿足如下條件:

  • const 必須修飾val
  • const 只允許在top-level級別和object中聲明
//定義支持“宏替換”的常量
const val MAX_AGE = 100

fun main(args: Array<String>) {
    println(MAX_AGE)
}

輸出結果: 100


如果被賦值的表達式只是基本的算術表達式或進行字符串連接運算,沒有訪問普通變量、常量、方法,Kotlin編譯器同樣會將這種const常量當成“宏變量”處理。

//定義3個“宏變量”
const val a = 1+2
const val b:Double=1.2/3
const val str:String="瘋狂"+"外星人"

fun main(args: Array<String>) {
    println(str === "瘋狂外星人")
}

輸出結果:true 

 


8、const val和val區別:

const和val 修飾的兩個String類型,如下:

object myObject {
    const val constObject: String = "constObject"

    val normalObject: String = "normalObject"
}

打開Android studio 點擊 Tools->Kotlin->Show Kotlin ByteCode,如下:

public final class com/example/kotlin/myObject {
  public final static Ljava/lang/String; constObject = "constObject"

  private final static Ljava/lang/String; normalObject = "normalObject"

  public final getNormalObject()Ljava/lang/String;
}

主要區別:

  • const val 可見性爲public final static,可以直接訪問。
  • val 可見性爲private final static,並且val 會生成方法getNormalObject(),通過方法調用訪問。

注意:當定義常量時,出於效率考慮,我們應該使用const val方式,避免頻繁函數調用。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章