kotlin中init块和构造函数的区别是什么?
我已经开始学习Kotlin了。我想知道kotlin中init块和构造函数的区别是什么?,kotlin,constructor,initialization-block,Kotlin,Constructor,Initialization Block,我已经开始学习Kotlin了。我想知道init块和constructor之间的区别。 这与我们如何利用这一点来改进有什么区别 class Person constructor(var name: String, var age: Int) { var profession: String = "test" init { println("Test") } } Kotlin class A主构造函数中的一个类(类名后的一个),不包含代码,它只能
init
块和constructor
之间的区别。
这与我们如何利用这一点来改进有什么区别
class Person constructor(var name: String, var age: Int) {
var profession: String = "test"
init {
println("Test")
}
}
Kotlin class A主构造函数中的一个类(类名后的一个),不包含代码,它只能初始化属性(例如
class X(var prop:String)
)
init{..}
块位于以下位置,您可以在此处放置更多在属性初始化后运行的代码:
初始值设定项块的执行顺序与它们在类主体中出现的顺序相同,并与属性初始值设定项交错
更多关于这方面的信息,请参阅
以下是一个例子:
class X(var b: String) {
val a = print("a")
init {
print("b")
}
constructor() : this("aaa") {
print("c")
}
}
X()
调用时,它将打印
abc
。因此,init{..}
在主构造函数之后调用,但在次构造函数之前调用。init块将在主构造函数之后立即执行。初始值设定项块实际上成为主构造函数的一部分。构造函数是辅助构造函数。对主构造函数的委托发生在次构造函数的第一条语句中,因此所有初始值设定项块中的代码都在次构造函数主体之前执行
示例
class Sample(private var s : String) {
constructor(t: String, u: String) : this(t) {
this.s += u
}
init {
s += "B"
}
}
您是否认为已使用初始化示例类
Sample("T","U")
您将在变量s处得到一个字符串响应,作为“TBU”
。
值“T”
从Sample类的主构造函数分配给s,然后init块立即开始执行,它将向变量添加“B”
。在init block之后,二级构造函数块开始执行,s将成为“TBU”
,因为
主构造函数不能包含任何代码
init块允许向主构造函数添加代码。如Kotlin文档中所述: 主构造函数不能包含任何代码。初始化代码可以放在初始值设定项块中,这些块的前缀是
init
关键字
在实例初始化过程中,初始值设定项块以与类主体中出现的相同顺序执行,与属性初始值设定项交织在一起:
那么,如果我们有一个二级构造函数,init block会调用第一个或二级构造函数吗?我们不能在主构造函数中初始化值。对吗?谢谢,我在答案中添加了一个示例“在初始化属性后,您可以放置更多将运行的代码”,这是不正确的。实际上,“初始值设定项块的执行顺序与它们在类主体中出现的顺序相同,与属性初始值设定项交错”。要查看差异,请将
val a
移动到init
块之后。请检查此项:检查此项