用例子解释Kotlin构造函数

142 阅读3分钟

构造函数是Kotlinclass 成员的一个特征,它允许你以一种清晰而简单的方式初始化一个类的属性。

在Kotlin中,一个class 成员可以有一个主构造函数和许多次要构造函数。本教程将首先关注主构造函数。

Kotlinclass 中的主构造函数被定义在括号中,是类头的一部分。

在下面的例子中,Person 类有一个名为namestring 属性的主构造函数:

class Person(val name: String)

当你初始化一个Person 类的对象时,你需要传递一个string 作为该对象的name 属性。

考虑一下下面的例子:

class Person(val name: String)
val person = Person("Jack")
println(person.name) // Jack

根据class 的要求,主构造函数可以有任意多的属性。

你可以在构造函数中添加多个属性,用逗号分隔,如下所示:

class Person(val name: String, var age: Int, var isAdult: Boolean)

在上面的例子中,ageisAdult 属性是使用var 关键字初始化的。

使用val 关键字定义的属性是只读属性,而var 属性值可以被对象变异。

构造器属性总是可以使用属性名称从初始化对象中调用:

val person = Person("Jack", 27, true)
// modifying the properties
person.age = 14
person.isAdult = false
// calling the properties
println(person.age) // 14

你也可以为构造器属性定义默认值,如下图所示:

class Person(val name: String = "Nathan", var age: Int = 29)

当你想对构造函数应用访问修改器时,你需要在括号前添加constructor 关键字。

例如,下面的class 有一个private constructor

class Person private constructor(val name: String)

但构造函数最常见的用法是像前面的例子一样,省略constructor 关键字。

当你有一个长的构造函数时,你可以把每个属性定义移到它自己的行中。

考虑一下下面的class 例子:

class Person(
val name: String = "Nathan",
var age: Int = 29,
var isAdult: Boolean,
var profession: String,
var citizenship: String,
)

这样,属性将比类名旁边的单一长行更容易阅读。

在构造函数中初始化的属性可以被用来初始化类主体中的变量:

class Person(
val name: String = "Nathan",
var age: Int = 29,
) {
 val customerId = name.uppercase()
}

最后,Kotlin的主构造函数只能初始化属性值而不能运行任何语句。

如果你想在对象被初始化后运行任何代码,你需要在类主体内使用init 关键字定义一个初始化块。

考虑一下下面的例子:

class Person(
var name: String,
var age: Int,
) {
 init {
 println("Hello! My name is $name")
 println("I am $age years old")
 }
}
val person = Person("Nathan", 29)
// Hello! My name is Nathan
// I am 29 years old

person.name = "Jack"
person.age = 27

上面的init 块将在对象被初始化后立即被调用,所以即使你改变了类的属性,也只有初始值被用于init 代码块。

而这就是class 构造函数在Kotlin中的工作方式。

接下来,我们来学习一下Kotlin的二级构造函数