Kotlin中的init块和构造函数有什么区别?

yqkkidmi  于 2022-11-25  发布在  Kotlin
关注(0)|答案(4)|浏览(183)

我已经开始学习Kotlin了。我想知道init块和constructor的区别。这之间有什么区别,我们如何利用这一点来改进?

class Person constructor(var name: String, var age: Int) {
    var profession: String = "test"

    init {
        println("Test")
     }    
}
lokaqttq

lokaqttq1#

  • *init**块将在主构造函数之后立即执行。初始化程序块实际上成为主构造函数的一部分。
    constructor是辅助构造函数。对主构造函数的委托发生在辅助构造函数的第一条语句中,因此所有初始化程序块中的代码都在辅助构造函数主体之前执行。
    示例
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"

5rgfhyps

5rgfhyps2#

因为,
主构造函数不能包含任何代码。
https://kotlinlang.org/docs/reference/classes.html
init{..}块允许向主构造函数添加代码。

sgtfey8w

sgtfey8w3#

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。因此,init{..}在主构造函数 * 之后 * 但在次构造函数之前被调用。

bkhjykvo

bkhjykvo4#

如Kotlin文件所述:
主构造函数不能包含任何代码。初始化代码可以放在初始值设定项块中,这些块以init关键字为前缀。
在示例初始化过程中,初始化程序块按照它们出现在类体中的相同顺序执行,与属性初始化程序交错:...
https://kotlinlang.org/docs/classes.html#constructors

相关问题