Kotlin可見性修飾符

類,對象,接口,構造函數,函數,屬性及其設置器可以具有可見性修飾符。 (Getter總是具有與屬性相同的可見性。)Kotlin中有四個可見性修飾符:

private, protected, internalpublic。如果沒有顯式修飾符,則使用的默認可見性是public

下面請查看不同類型聲明範圍的說明。

函數,屬性和類,對象和接口可以在「頂層」上聲明,即直接在包中:

// file name: example.kt
package foo

fun baz() {}
class Bar {}
  • 如果沒有指定任何可見性修飾符,則默認使用public,這意味着聲明將在任何位置都可見;
  • 如果將一個聲明標記爲private,那麼它只會在包含聲明的文件中可見;
  • 如果將其標記爲internal,則在同一模塊中的任何地方可見;
  • 如果將其標記爲protected,則不可用於頂層聲明。

示例

// file name: example.kt
package foo

private fun foo() {} // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt

internal val baz = 6    // visible inside the same module

類和接口

對於在類中聲明的成員:

  • private只有在這個類才能看到(包括其所有成員);
  • protected - 相同於private + 在子類中可見;
  • internal - 模塊中的任何看到聲明類的客戶端都看到其內部成員;
  • public - 聲明類的任何客戶看到它的公共成員。

注意Java用戶:外部類不會在Kotlin中看到其內部類的私有成員。

如果覆蓋protected的成員,並且不明確指定可見性,則覆蓋成員也將具有protected的可見性。

例子

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4  // public by default

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
}

class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either 
}

構造函數

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

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

這裏的構造函數是:private。 默認情況下,所有構造函數都是public,它們有效地相當於在類可見的地方可見(即internal類的構造函數只能在同一模塊中可見)。

局部聲明

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

模塊

內部可見性修飾符意味着該成員可以使用相同的模塊。 更具體地說,一個模塊是一組編譯的Kotlin文件:

  • IntelliJ IDEA模塊;
  • Maven或Gradle項目;
  • 通過一次調用Ant任務編譯的一組文件。