Kotlin研發第八彈——可見性修飾符

可見性修飾符

類、對象、接口、構造函數、方法、屬性和它們的 setter 都可以有 可見性修飾符。 (getter 總是與屬性有着相同的可見性。) 在 Kotlin 中有這四個可見性修飾符:privateprotectedinternalpublic。 如果沒有顯式指定修飾符的話,默認可見性是 public

以下解釋了這些修飾符如何應用到不同類型的聲明作用域。

函數、屬性和類、對象和接口可以在頂層聲明,即直接在包內:

// 文件名:example.kt
package foo

fun baz() { ... }
class Bar { ... }
  • 如果你不指定任何可見性修飾符,默認爲 public,這意味着你的聲明將隨處可見;
  • 如果你聲明爲 private,它只會在聲明它的文件內可見;
  • 如果你聲明爲 internal,它會在相同模塊內隨處可見;
  • protected 不適用於頂層聲明。

注意:要使用另一包中可見的頂層聲明,仍需將其導入進來。

例如:

// 文件名:example.kt
package foo

private fun foo() { …… } // 在 example.kt 內可見

public var bar: Int = 5 // 該屬性隨處可見
    private set         // setter 只在 example.kt 內可見
   
internal val baz = 6    // 相同模塊內可見

類和接口

對於類內部聲明的成員:

  • private 意味着只在這個類內部(包含其所有成員)可見;
  • protected—— 和 private一樣 + 在子類中可見。
  • internal —— 能見到類聲明的 本模塊內 的任何客戶端都可見其 internal 成員;
  • public —— 能見到類聲明的任何客戶端都可見其 public 成員。

注意 對於Java用戶:Kotlin 中外部類不能訪問內部類的 private 成員。

如果你覆蓋一個 protected 成員並且沒有顯式指定其可見性,該成員還會是 protected 可見性。

例子:

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4  // 默認 public
   
    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a 不可見
    // b、c、d 可見
    // Nested 和 e 可見

    override val b = 5   // “b”爲 protected
}

class Unrelated(o: Outer) {
    // o.a、o.b 不可見
    // o.c 和 o.d 可見(相同模塊)
    // Outer.Nested 不可見,Nested::e 也不可見
}

構造函數

要指定一個類的的主構造函數的可見性,使用以下語法(注意你需要添加一個顯式 constructor 關鍵字):

class C private constructor(a: Int) { …… }

這裏的構造函數是私有的。默認情況下,所有構造函數都是 public,這實際上等於類可見的地方它就可見(即 一個 internal 類的構造函數只能在相同模塊內可見).

局部聲明

局部變量、函數和類不能有可見性修飾符。

模塊

可見性修飾符 internal 意味着該成員只在相同模塊內可見。更具體地說, 一個模塊是編譯在一起的一套 Kotlin 文件:

  • 一個 IntelliJ IDEA 模塊;
  • 一個 Maven 項目;
  • 一個 Gradle 源集(例外是 test 源集可以訪問 main 的 internal 聲明);
  • 一次 <kotlinc> Ant 任務執行所編譯的一套文件。

跳轉上一章 Kotlin研發第七彈——屬性與字段

跳轉下一章 Kotlin研發第九彈——擴展

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