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

解释

我们不能在次构造函数参数中使用数据类型。

广告