kotlin中init块和构造函数的区别是什么?

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主构造函数中的一个类(类名后的一个),不包含代码,它只能

我已经开始学习Kotlin了。我想知道
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
块之后。请检查此项:检查此项