我已经开始学习 Kotlin。我想知道init
block 和constructor
. 这与我们如何使用它来改进之间有什么区别?
class Person constructor(var name: String, var age: Int) {
var profession: String = "test"
init {
println("Test")
}
}
我已经开始学习 Kotlin。我想知道init
block 和constructor
. 这与我们如何使用它来改进之间有什么区别?
class Person constructor(var name: String, var age: Int) {
var profession: String = "test"
init {
println("Test")
}
}
init块将在主构造函数之后立即执行。Initializer 块有效地成为主构造函数的一部分。构造函数是辅助构造函数。对主构造函数的委托作为辅助构造函数的第一条语句发生,因此所有初始化程序块中的代码都在辅助构造函数主体之前执行。
例子
class Sample(private var s : String) {
constructor(t: String, u: String) : this(t) {
this.s += u
}
init {
s += "B"
}
}
认为你初始化了 Sample 类
Sample("T","U")
您将在变量s as处获得字符串响应"TBU"
。值从Sample类的主构造函数中"T"
赋值给s,然后 init 块立即开始执行,它将添加到变量中。在 init block 二级构造函数块开始执行后,s将变为."B"
"TBU"
Kotlin 类中的一个类是一个不包含代码的主构造函数(类名之后的构造函数),它只能初始化属性(例如class X(var prop: String)
)。
该位置的init{..}
块,您可以在其中放置更多将在属性初始化后运行的代码:
初始化程序块的执行顺序与它们在类主体中出现的顺序相同,与属性初始化程序交错
有关这方面的更多信息,请参见 https://kotlinlang.org/docs/reference/classes.html#constructors
这是一个例子:
class X(var b: String) {
val a = print("a")
init {
print("b")
}
constructor() : this("aaa") {
print("c")
}
}
X()
调用时会打印abc
. 因此in 在主构造函数之后但在辅助构造函数之前init{..}
调用。
如 Kotlin 文档中所述:
主构造函数不能包含任何代码。初始化代码可以放在以关键字为前缀的初始化程序块中。
init
在实例初始化期间,初始化程序块的执行顺序与它们在类体中出现的顺序相同,并与属性初始化程序交错:...