我已经开始学习Kotlin了。我想知道init块和constructor的区别。这之间有什么区别,我们如何利用这一点来改进?
init
constructor
class Person constructor(var name: String, var age: Int) { var profession: String = "test" init { println("Test") } }
lokaqttq1#
class Sample(private var s : String) { init { s += "B" } constructor(t: String, u: String) : this(t) { this.s += u } }
您应该使用以下代码初始化Sample类
Sample("T","U")
您将在变量s处获得字符串响应"TBU"。从Sample类的主构造函数将值"T"赋给s。然后立即开始执行init块;它会将"B"添加到s变量中。接下来是二级构造函数轮次;现在,"U"被添加到s变量,以变成"TBU"。
"TBU"
"T"
"B"
"U"
5rgfhyps2#
因为,主构造函数不能包含任何代码。https://kotlinlang.org/docs/reference/classes.htmlinit{..}块允许向主构造函数添加代码。
init{..}
sgtfey8w3#
Kotlin类中的一个类,它是一个主构造函数(类名后面的那个),不包含代码,只能初始化属性(例如class X(var prop: String))。init{..}块,在这里可以放置更多的代码,这些代码将在属性初始化 * 之后 * 运行:初始值设定项块的执行顺序与它们在类体中出现的顺序相同,并与属性初始值设定项交错更多信息请访问https://kotlinlang.org/docs/reference/classes.html#constructors以下是一个示例:
class X(var prop: String)
class X(var b: String) { val a = print("a") init { print("b") } constructor() : this("aaa") { print("c") } } X()
当被调用时,它打印abc。因此,init{..}在主构造函数 * 之后 * 但在次构造函数之前被调用。
abc
bkhjykvo4#
如Kotlin文件所述:主构造函数不能包含任何代码。初始化代码可以放在初始值设定项块中,这些块以init关键字为前缀。在示例初始化过程中,初始化程序块按照它们出现在类体中的相同顺序执行,与属性初始化程序交错:...https://kotlinlang.org/docs/classes.html#constructors
4条答案
按热度按时间lokaqttq1#
constructor是辅助构造函数。对主构造函数的委托发生在辅助构造函数的第一条语句中,因此所有初始化程序块中的代码都在辅助构造函数主体之前执行。
示例
您应该使用以下代码初始化Sample类
您将在变量s处获得字符串响应
"TBU"
。从Sample类的主构造函数将值
"T"
赋给s。然后立即开始执行init块;它会将
"B"
添加到s变量中。接下来是二级构造函数轮次;现在,
"U"
被添加到s变量,以变成"TBU"
。5rgfhyps2#
因为,
主构造函数不能包含任何代码。
https://kotlinlang.org/docs/reference/classes.html
init{..}
块允许向主构造函数添加代码。sgtfey8w3#
Kotlin类中的一个类,它是一个主构造函数(类名后面的那个),不包含代码,只能初始化属性(例如
class X(var prop: String)
)。init{..}
块,在这里可以放置更多的代码,这些代码将在属性初始化 * 之后 * 运行:初始值设定项块的执行顺序与它们在类体中出现的顺序相同,并与属性初始值设定项交错
更多信息请访问https://kotlinlang.org/docs/reference/classes.html#constructors
以下是一个示例:
当被调用时,它打印
abc
。因此,init{..}
在主构造函数 * 之后 * 但在次构造函数之前被调用。bkhjykvo4#
如Kotlin文件所述:
主构造函数不能包含任何代码。初始化代码可以放在初始值设定项块中,这些块以
init
关键字为前缀。在示例初始化过程中,初始化程序块按照它们出现在类体中的相同顺序执行,与属性初始化程序交错:...
https://kotlinlang.org/docs/classes.html#constructors