构造函数是Kotlinclass 成员的一个特征,它允许你以一种清晰而简单的方式初始化一个类的属性。
在Kotlin中,一个class 成员可以有一个主构造函数和许多次要构造函数。本教程将首先关注主构造函数。
Kotlinclass 中的主构造函数被定义在括号中,是类头的一部分。
在下面的例子中,Person 类有一个名为name 的string 属性的主构造函数:
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)
在上面的例子中,age 和isAdult 属性是使用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的二级构造函数。