Kotlin - 构造函数


Kotlin 构造函数是类中的特殊成员函数,在实例化对象时会调用它。每当创建一个对象时,都会自动调用定义的构造函数,用于初始化类的属性。

每个 Kotlin 类都需要有一个构造函数,如果我们不定义它,那么编译器会生成一个默认构造函数。

Kotlin 类可以有以下两种类型的构造函数:

  • 主要构造函数

  • 第二建造者

Kotlin 类可以有一个主构造函数和一个或多个附加的辅助构造函数。Kotlin 主构造函数初始化类,而辅助构造函数有助于在初始化类时包含一些额外的逻辑。

Kotlin 主构造函数

主构造函数可以在类头级别声明,如下例所示。

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

如果没有指定注释或访问修饰符(如 public、private 或 protected),则可以省略构造函数关键字。

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

测验时间(面试和考试准备)

问题 1 - 我们可以在 Kotlin 程序中定义 N 个构造函数:

A - 是

B-

答案:A

解释

是的,我们可以在 Kotlin 程序中定义一个主构造函数和多个辅助构造函数

问题 2 - 使用哪个关键字来定义 Kotlin 构造函数:

A-初始化

B - 构造函数

C-构造函数

D - 以上所有

答案:B

解释

尽管如果没有指定注释或访问修饰符,则可以省略构造函数关键字。

Q 3 - Kotlin 允许为构造函数参数设置默认值。

A - 正确

B - 错误

答案:A

解释

是的,我们可以为任何构造函数参数设置默认值。

问题 4 - 第二个构造函数不允许使用数据类型及其参数。

A - 正确

答案:A

解释

我们不能将数据类型与辅助构造函数参数一起使用。