Kotlin - 建構函式



Kotlin 建構函式是類中一個特殊的成員函式,在例項化物件時會被呼叫。每當建立物件時,都會自動呼叫定義的建構函式,用於初始化類的屬性。

每個 Kotlin 類都需要有一個建構函式,如果我們沒有定義它,則編譯器會生成一個預設建構函式。

Kotlin 類可以有以下兩種型別的建構函式

  • 主建構函式

  • 次建構函式

Kotlin 類可以有一個主建構函式和一個或多個附加的次建構函式。Kotlin 主建構函式初始化類,而次建構函式有助於在初始化類時包含一些額外的邏輯。

Kotlin 主建構函式

主建構函式可以在類頭級別宣告,如下例所示。

class Person constructor(val firstName: String, val age: Int) {
   // class body
}

如果未指定任何註釋或訪問修飾符(如 public、private 或 protected),則可以省略constructor關鍵字。

class Person (val firstName: String, val age: Int) {
   // class body
}

在本例中,我們透過val關鍵字聲明瞭屬性以使其成為只讀的。如果需要稍後更改這些屬性的值,則可以使用關鍵字var定義它們。

初始化塊

主建構函式不能包含任何程式碼。初始化程式碼可以放置在以init關鍵字為字首的初始化塊中。可以有多個init塊,在例項初始化期間,初始化塊按其在類體中出現的順序執行,與屬性初始化器交錯。

以下是一個使用初始化塊的示例

class Person (val _name: String, val _age: Int) {
   // Member Variables
   var name: String
   var age: Int

   // Initializer Block
   init {
      this.name = _name
      this.age = _age
      println("Name = $name")
      println("Age = $age")
   }
}

fun main(args: Array<String>) {
   val person = Person("Zara", 20)
}

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

Name = Zara
Age = 20

預設值

Kotlin 允許使用一些預設值初始化建構函式引數。以下是同一個的工作示例

class Person (val _name: String, val _age: Int=20) {
   // Member Variables
   var name: String
   var age: Int

   // Initializer Block
   init {
      this.name = _name
      this.age = _age
      println("Name = $name")
      println("Age = $age")
   }
}

fun main(args: Array<String>) {
   val zara = Person("Zara")
   val nuha = Person("Nuha", 11)
}

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

Name = Zara
Age = 20
Name = Nuha
Age = 11

Kotlin 次建構函式

如前所述,Kotlin 允許為您的類建立一個或多個次建構函式。此次建構函式是使用constructor關鍵字建立的。當您想要在 Kotlin 中建立多個建構函式時,或者當您想要在主建構函式中包含更多邏輯但無法做到這一點時(因為主建構函式可能被其他類呼叫),則需要使用此建構函式。

示例

檢視以下示例,我們在這裡建立了一個次建構函式來再次實現上述示例

class Person{
   // Member Variables
   var name: String
   var age: Int

   // Initializer Block
   init {
      println("Initializer Block")
   }

   // Secondary Constructor
   constructor ( _name: String, _age: Int) {
      this.name = _name
      this.age = _age
      println("Name = $name")
      println("Age = $age")
   }
}

fun main(args: Array<String>) {
   val zara = Person("Zara", 20)
}

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

Initializer Block
Name = Zara
Age = 20

次建構函式不允許在次建構函式引數中使用valvar。現在讓我們來看一個有兩個次建構函式的示例

class Person{
   // Member Variables
   var name: String
   var age: Int
   var salary:Double

   // First Secondary Constructor
   constructor ( _name: String, _age: Int) {
      this.name = _name
      this.age = _age
      this.salary = 0.00
      println("Name = $name")
      println("Age = $age")
   }

   // Second Secondary Constructor
   constructor ( _name: String, _age: Int, _salary: Double) {
      this.name = _name
      this.age = _age
      this.salary = _salary
      println("Name = $name")
      println("Age = $age")
      println("Salary = $salary")
   }
}

fun main(args: Array<String>) {
   val nuha = Person("Nuha", 12)
   val zara = Person("Zara", 20, 2000.00)
}

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

Name = Nuha
Age = 12
Name = Zara
Age = 20
Salary = 2000.0

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

Q 1 - 我們可以在 Kotlin 程式中定義 N 個建構函式

A - 是的

B - 否

答案:A

解釋

是的,我們可以在 Kotlin 程式中定義一個主建構函式和多個次建構函式

Q 2 - 使用哪個關鍵字定義 Kotlin 建構函式

A - init

B - constructor

C - Constructor

D - 以上皆是

答案:B

解釋

儘管如果未指定任何註釋或訪問修飾符,則可以省略constructor關鍵字。

Q 3 - Kotlin 允許為建構函式引數設定預設值。

A - 正確

B - 錯誤

答案:A

解釋

是的,我們可以為任何建構函式引數設定預設值。

Q 4 - 次建構函式不允許在其引數中使用資料型別。

A - 正確

B - B

答案:A

解釋

我們不能在次建構函式引數中使用資料型別。

廣告