Kotlin - 可見性控制(修飾符)



Kotlin 的可見性修飾符是用於設定類、物件、介面、建構函式、函式以及屬性及其設定器可見性的關鍵字。儘管 getter 始終與其屬性具有相同的可見性,因此我們無法設定其可見性。

Setter 是用於設定屬性值的函式,而 getter 是用於獲取這些屬性值的函式。

Kotlin 中有四個可見性修飾符

  • public

  • private

  • protected

  • internal

預設可見性為 public。這些修飾符可以在多個位置使用,例如類頭或方法體。讓我們詳細瞭解這些修飾符。

Public 修飾符

Public 修飾符可在專案工作區的任何位置訪問。如果未指定訪問修飾符,則預設情況下它將處於 public 範圍。在我們之前的所有示例中,我們都沒有提及任何修飾符,因此,它們都處於 public 範圍。以下是一個示例,用於更深入地瞭解如何宣告 public 變數或方法。

class publicExample {
   val i = 1
   
   fun doSomething() {
   }
}

在上面的示例中,我們沒有提及任何修飾符,因此此處定義的方法和變數預設情況下為 public。雖然上面的示例可以使用 **public** 修飾符顯式地編寫如下

public class publicExample {
   public val i = 1
   
   public fun doSomething() {
   }
}

Private 修飾符

類、方法、包和其他屬性可以使用 **private** 修飾符宣告。此修飾符與 public 的含義幾乎完全相反,這意味著私有成員無法在其範圍之外訪問。一旦任何內容被宣告為 private,則只能在其直接範圍內訪問。例如,私有包可以在該特定檔案中訪問。私有類或介面只能由其資料成員訪問,等等。

private class privateExample {
   private val i = 1
   
   private val doSomething() {
   }
}

在上面的示例中,類 **privateExample** 只能從同一個原始檔中訪問,變數 **i** 和方法 **doSomething** 只能從 privateExample 類內部訪問。

示例

讓我們檢查一個簡單的示例,展示私有成員的使用。

open class A() {
   private val i = 1
   
   fun doSomething(){
      println("Inside doSomething" )
      println("Value of i is $i" )
   }
}
class B : A() {
   fun printValue(){
       doSomething()
       // println("Value of i is $i" )
   }
}

fun main(args: Array<String>) {  
   val a = A()
   val b = B()
   
   b.printValue()
}  

執行上面的 Kotlin 程式時,將生成以下輸出

Inside doSomething
Value of i is 1

在這裡,我們無法訪問類 B 內部的變數 **i**,因為它已定義為 private,這意味著它只能在類本身內部訪問,其他地方無法訪問。

Protected 修飾符

Protected 是 Kotlin 的另一個訪問修飾符,目前不適用於頂級宣告,例如任何包都不能是 protected。受保護的類或介面或屬性或函式僅對其自身及其子類可見。

package one;

class A() {
   protected val i = 1
}
class B : A() {
   fun getValue() : Int {
      return i
   }
}

在上面的示例中,變數 **i** 宣告為 protected,因此,它僅對類本身及其子類可見。

示例

讓我們檢查一個簡單的示例,展示受保護成員的使用。

open class A() {
   protected val i = 1
   
   protected fun doSomething(){
      println("Inside doSomething" )
      println("Value of i is $i" )
   }
}
class B : A() {
   fun printValue(){
       doSomething()
       println("Value of i is $i" )
   }
}

fun main(args: Array<String>) {  
   val a = A()
   val b = B()
   
   //a.doSomething()
   
   b.printValue()
}  

執行上面的 Kotlin 程式時,將生成以下輸出

Inside doSomething
Value of i is 1
Value of i is 1

在這裡,我們甚至無法使用 A 類的物件呼叫 **doSomething()**,因為它已定義為 protected,這意味著它只能在類本身或其子類中訪問。

Internal 修飾符

Internal 是 Kotlin 中新新增的修飾符。如果任何內容被標記為 internal,則該特定欄位將被標記為 internal 欄位。Internal 包僅在其實現的模組內可見。Internal 類介面僅由同一包或模組內的其他類可見。在下面的示例中,我們將看到如何實現 internal 方法。

package one

internal class InternalExample {
}

class publicExample{
    internal val i = 1

    internal fun doSomething() {
    }
}

在上面的示例中,類 **InternalExample** 只能從同一個模組內部訪問,類似地,變數 **i** 和函式 **doSomething()** 也只能從同一個模組內部訪問,即使類 **publicExample** 可以從任何地方訪問,因為此類預設具有 **public** 可見性。

示例

讓我們檢查一個簡單的示例,展示 internal 成員的使用。

package com.tutorialspoint.modifiers

open class A() {
   internal val i = 1
   
   internal fun doSomething(){
      println("Inside doSomething" )
      println("Value of i is $i" )
   }
}
class B : A() {
   fun printValue(){
       doSomething()
       println("Value of i is $i" )
   }
}

fun main(args: Array<String>) {  
   val a = A()
   val b = B()
   
   a.doSomething()
   
   b.printValue()
}  

執行上面的 Kotlin 程式時,將生成以下輸出

Inside doSomething
Value of i is 1
Inside doSomething
Value of i is 1
Value of i is 1

測驗時間 (面試 & 考試準備)

Q 1 - 以下哪個不是 Kotlin 中的可見性修飾符?

A - public

B - private

C - abstract

D - internal

答案:C

解釋

Abstract 不是 Kotlin 中的可見性修飾符,儘管它用於定義抽象類。

答案:D

解釋

是的,受保護的成員只能被其類或子類訪問,這是正確的。

廣告

© . All rights reserved.