在Kotlin中,有一个主要构造函数和许多次要构造函数;主构造函数是类头的一部分,它位于类名和可选类型参数之后。
这里主要通过简单示例展示Kotlin中的主要和次要/多个构造函数
1、主构造函数
这是带有一个参数的主构造函数。
class Example constructor(private val param1: String) {
init {
println("init is called.")
}
}
也可以省略构造函数constructor
关键字。
class Example(private val param1: String) {
init {
println("init is called.")
}
}
不能在主构造函数中初始化。相反,你需要在init{}块中初始化你的代码。
主构造函数参数可以在初始化块中使用。它们也可以用在类主体中声明的属性初始化式中:
在实例初始化过程中,初始化程序块按照它们在类主体中出现的顺序执行,并与属性初始化程序交叉执行:
class Example(param1: String) {
val firstProperty:String = "First property: $param1".also(::println)
init {
println("init is called. $param1")
}
}
First property: hello
init is called. hello
2、次构造函数
下面有两个次构造函数。
class Example(private val param1: String) {
init {
println("init is called.")
}
//第一个次构造函数
constructor(
param1: String,
param2: String) : this(param1) {
println("Second constructor is called")
}
//第二个次构造函数
constructor(
param1: String,
param2: String,
param3: String) : this(param1) {
println("Third constructor is called")
}
}
注意事项:
“
1、你必须直接或者间接调用主构造函数(例如调用this(param1)
)。
2、你可以在次要构造函数参数中声明var
或val
3、可以在次要构造函数中初始化代码
请注意,主构造函数和init{}
块在次构造函数初始化之前首先被调用。
如果我调用第三个构造函数,
val obj = Example(param1="1", param2="2", param3="3")
输出结果顺序是这样的:
init is called.
Third constructor is called
3、调用另一个次构造函数
除了在辅助构造函数中调用主构造函数,还可以调用另一个辅助构造函数。
在如下例中,第二个次构造函数调用第一个次构造函数。
class Example(private val param1: String) {
init {
println("init is called.")
}
//第一个次构造函数
constructor(
param1: String,
param2: String) : this(param1) {
println("Second constructor is called")
}
//第二个次构造函数
constructor(
param1: String,
param2: String,
param3: String) : this(param1, param2) {
println("Third constructor is called")
}
}
如果我调用第三个构造函数,输出如下所示:
init is called.
Second constructor is called
Third constructor is called
4、空主构造函数
这是一个空的主构造函数和次构造函数示例。
class Example() {
init {
println("init is called.")
}
constructor(param1: String): this() {
println("Second constructor is called")
}
}
但是,实际上并不需要在次要构造函数中调用this(
),您还需要将Example()
更改为Example
。
class Example {
init {
println("init is called.")
}
constructor(param1: String) {
println("Second constructor is called")
}
}
5、构造器用例
使用以下语法指定类的主构造函数的可见性:
您需要添加一个显式constructor
关键字。
class Example private constructor (param1: String) {
init {
println("init is called.")
}
}
这里的构造函数是私有的。默认情况下,所有构造函数都是公共的,这实际上意味着它们在类可见的任何地方都是可见的(这意味着内部类的构造函数只在同一个模块中可见)。
最后
我没有用过很多多重构造函数,你们呢?所以,我将其记录在这里,以供将来参考。