目錄
4、在kotlin中,abstract的用法幾乎和Java一致
前言
這篇書寫風格可能比較簡單,只作爲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
對於接口類來說,基本用不上
fianl
、open
、abstract。
因爲接口類默認是
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方式,避免頻繁函數調用。