Kotlin 學習筆記(九)—— Kotlin類與對象之可見性修飾符

Kotlin 學習筆記(九)—— Kotlin類與對象之可見性修飾符


Kotlin學習筆記系列教程

Kotlin 學習筆記(一)—— 概述、學習曲線、開發工具、參考資料
Kotlin 學習筆記(二)—— 基礎語法
Kotlin 學習筆記(三)—— 習慣用法
Kotlin 學習筆記(四)—— Kotlin基礎之基本類型
Kotlin 學習筆記(五)—— Kotlin基礎之控制流、返回與跳轉、 包與導入
Kotlin 學習筆記(六)—— Kotlin類與對象之類和繼承
Kotlin 學習筆記(七)—— Kotlin類與對象之屬性與字段
Kotlin 學習筆記(八)—— 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 任務執行所編譯的一套文件。

個人博客地址:http://outofmemory.top/
CSDN地址:http://blog.csdn.net/dazhaoDai
GitHub地址:https://github.com/dazhaoDai


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