1. 程式人生 > >Kotlin學習(11):可見性修飾符

Kotlin學習(11):可見性修飾符

1、應用域

類、物件、介面、建構函式、方法、屬性和它們的setter都可以有可見性修飾符。在Kotlin中有四個可見性修飾符:

  • private
  • protected
  • internal
  • public

如果沒有顯式指定修飾符的話,預設可見性都是public。

2、包名

函式、屬性和類、物件和介面可以在頂層宣告,即直接在包內:

package foo

fun baz(){}
class Bar{}

每一個修飾符都限制了一定的範圍:

  • 未指定修飾符時,預設為public,表明隨處可見
  • 宣告為public時,它只會在宣告它的檔案內可見;
  • 宣告為internal,它會在相同模組內隨處可見;
  • protected不適用於頂層宣告。

例如:

package foo

//在此類內隨處可見
private fun foo(){}

//該屬性隨處可見
public var bar: Int = 5
    //setter只在此檔案內可見
    private set

//相同模組內可見
internal val baz = 6

3、類和介面

對於類內部宣告的成員:

  • private意味著只在這個類內部(包含其所有成員)可見;
  • protectedprivate一樣+在子類中可見。
  • internal能剪刀類宣告的本模組內的任何客戶端都可見其internal成員;
  • public能見到類宣告的任何客戶端都是可見其public
    成員。
open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4

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

class Subclass : Outer() {
    //b被open修飾,可以直接訪問
    override val b: Int
        get() = 5

    val xx = Outer()
    //修飾符是protected或者private
private var yy = Outer.Nested() fun foo() { //c,d,e可見,但是需要通過對應物件 println(xx.c) println(xx.d) print(yy.e) } } class Unrelated(o: Outer) { val kk = o fun stringPrint() { //a,b不可見,c,,d可見 print(kk.c) print(kk.d) } }

要指定一個類的主建構函式的可見性,使用以下語法,需要新增一個顯式的constructor關鍵字:

class C private constructor(a: Int){
    //程式碼塊
}

4、模組

可見性修飾符internal意味著該成員只在相同模組內可見。更具體的說,一個模組是編譯在一起的一套Kotlin檔案:

  • 一個IntellJ IEDA模組;
  • 一個Maven或者Gradle專案;
  • 一次<kotlinc>Ant任務執行所編譯的一套檔案。