Kotlin可見性修飾符
Java為我們提供了public、protected、private以及default四個可見性修飾符,用來指定類、方法及屬性的可見性。Kotlin中的可見性修飾符與Java中的很類似,但也有不一樣的地方,主要有以下幾點:
- Kotlin與Java的預設修飾符不同,Kotlin中是public,而Java中是default;
- Kotlin中有一個獨特的修飾符internal;
- Kotlin可以在一個檔案內單獨宣告方法及常量,同樣支援可見性修飾符;
- Java中除了內部類可以用private修飾以外,其他類都不允許private修飾,而Kotlin可以;
- Kotlin和Java中的protected的訪問範圍不同,Java中是包、類及子類可訪問,而Kotlin只允許類及子類。
預設修飾符
很多時候,我們在實現類或者方法的時候都會省略它的修飾符。當然,在Java中我們很自然地會給類加上public修飾符,因為大多數類都可能需要在全域性訪問。而Java的預設修飾符是default,它只允許包內訪問。雖然通常IDE會自動幫我們加上public修飾符,但是這也讓人覺得它是一個多餘的宣告。所以,出於簡潔性的考慮,Kotlin將預設可見修飾符指定為了public。
前面我們說到了Java中預設修飾符是default,它的作用域是包內可訪問。那麼Kotlin中有類似的修飾符嗎?
Kotlin中的作用域
Kotlin中的作用域可以被稱作模組內訪問。那麼什麼是模組呢?模組可以看作一起編譯的Kotlin檔案組成的集合。那麼,Kotlin中為什麼要定義這種新的作用域呢?難道Java提供的包內訪問作用域不香嗎?Java的包內訪問作用域確實存在一些問題。舉個例子:假如我們在Java專案中定義了一個類,使用了預設修飾符,那麼這個類是包內可見,其他外部類將無法訪問它。接下來我們把這個專案打包成一個類庫,並提供給其他的專案使用。這時候,如果開發者想訪問之前定義的這個類,除了複製原始碼之外,還有一個方式。就是在程式中建立一個包,它的名字與該類所在的包的名字一致。通過這種方式,就可以直接訪問我們前面定義的類了。換句話說,我們之前定義的類就被洩露了,這很有可能導致問題。示例程式碼如下:
package com.dripower
/** 第三方類庫程式碼 */
class TestDefault {
...
}
package com.dripower
/** 在我們的專案中建立com.dripower包 */
class Test {
TestDefault td = new TestDefault()
}
Kotlin並沒有採用這種包內可見的作用域,而是使用了模組內可見的作用域。模組內可見指的是該類只對一起編譯的其他Kotlin檔案可見。由於開發工程與第三方類庫不屬於同一個模組,因此就解決了Java中存在的問題。這就是Kotlin中internal修飾符的作用。
在Java程式中,我們很少見到用private修飾的類,因為Java中的類或方法沒有單獨屬於某個檔案的概念。對於某個檔案來說,它裡面的類要麼是public,要麼是包私有,而沒有隻屬於這個檔案的概念。若要用private修飾,那麼這個只能是其他類的內部類。而Kotlin中則可以用private給單獨的類修飾,它的作用域就是當前這個Kotlin檔案。比如:
package com.dripower.car
class BMWCar(val name: String) {
private val bMWEngine = Engine("BMW")
fun getEngine(): String{
return bMWEngine.engineType()
}
}
private class Engine(val type: String) {
fun engineType(): String {
return "theenginetypeis$type"
}
}
Kotlin中的protected修飾符
除了private修飾符的差別,Kotlin中的protected修飾符也與Java有所不同。Java中的protected修飾的內容作用域是包內、類及子類可訪問,而在Kotlin中,由於沒有包作用域的概念,所以protected修飾符在Kotlin中的作用域只有類及子類。我們對上面的程式碼稍加修改:
package com.dripower.car
class BMWCar(val name: String) {
private val bMWEngine = BZEngine("BMW")
fun getEngine(): String {
return bMWEngine.engineType() // 編譯錯誤,engineType只對類及子類可見
}
}
private open class Engine(val type: String) {
protected open fun engineType(): String {
return "theenginetypeis$type"
}
}
private class BZEngine(type:String): Engine(type) {
override fun engineType(): String {
return super.engineType()
}
}
我們可以發現,同一個包下的其他類不能訪問protected修飾的內容,而在子類中則可以訪問。
總結一下,可見性修飾符在Kotlin與Java中大致相似,但也有自己的很多特殊之處。這些可見性修飾符比較如下所示。
修飾符 | 含義 | 與Java的比較 |
---|---|---|
public(預設) | Kotlin中的預設修飾符 | 與Java中的public效果相同 |
protected | 類及子類可見 | 含義一致,但作用域除了類及子類之外,包內也可見 |
private | 類內修飾只有本類可見,類外修飾檔案內可見 | 只有類內可見 |
internal | 模組內可見 | 無 |
相關文章
- Kotlin——中級篇(三):可見性修飾符詳解Kotlin
- 許可權修飾符
- Solidity語言學習筆記————19、函式可見性定義符、修飾符、保留字和語法Solid筆記函式
- Vue - 按鍵修飾符 && 系統修飾符Vue
- Kotlin 主建構函式引數的修飾符Kotlin函式
- Day33--屬性的修飾符
- Java 修飾符Java 修飾符
- java修飾符Java
- PHP 物件導向 (一)許可權修飾符PHP物件
- 許可權修飾符和final關鍵字
- 訪問修飾符
- Java 常用修飾符Java
- 繼承&修飾符繼承
- vue 事件修飾符Vue事件
- vue sync 修飾符Vue
- 封裝、許可權修飾符、封裝的案例封裝
- 【測試平臺開發】Vue的事件修飾符、按鍵修飾符、計算屬性學習教程Vue事件
- Java的static修飾符Java
- java中的修飾符Java
- 修飾符static和abstract
- 正規表示式全域性匹配模式(g修飾符)模式
- 四種許可權修飾符的簡單介紹
- [譯]Effective Kotlin系列之探索高階函式中inline修飾符(三)Kotlin函式inline
- Day39--類修飾符
- c語言中const修飾符C語言
- Java的訪問修飾符Java
- Vue事件修飾符詳解Vue事件
- java修飾符使用指南Java
- TypeScript 類訪問修飾符TypeScript
- Java 的包, 許可權修飾符與final關鍵字Java
- Java入門筆記(六)——訪問許可權修飾符Java筆記訪問許可權
- solidity 引用型別修飾符memory、calldata與storage 常量修飾符Constant與Immutable區別Solid型別LDA
- final關鍵字、內部類、四種許可權修飾符
- 許可權修飾符,方法及異常瞭解一下
- v-on 及其事件修飾符事件
- java oop 修飾符&關鍵字JavaOOP
- 正規表示式模式修飾符模式
- 從實踐認識修飾符