87

我已经开始学习 Kotlin。我想知道initblock 和constructor. 这与我们如何使用它来改进之间有什么区别?

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

    init {
        println("Test")
     }    
}
4

4 回答 4

143

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"

于 2019-03-27T10:02:25.383 回答
18

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{..}调用。

于 2019-03-26T12:16:48.190 回答
16

自从,

主构造函数不能包含任何代码。

https://kotlinlang.org/docs/reference/classes.html

init 块允许向主构造函数添加代码。

于 2020-06-27T14:57:28.423 回答
1

如 Kotlin 文档中所述:

主构造函数不能包含任何代码。初始化代码可以放在以关键字为前缀的初始化程序块中。init

在实例初始化期间,初始化程序块的执行顺序与它们在类体中出现的顺序相同,并与属性初始化程序交错:...

https://kotlinlang.org/docs/classes.html#constructors

于 2021-05-27T04:54:04.277 回答