时间:2019-03-26 12:10:36

标签: android kotlin

我已经开始学习Kotlin。我想知道init块和constructor之间的区别。 这和我们如何使用它来改善之间有什么区别?

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

init{
    println("Test")
    }

}

4 个答案:

答案 0 :(得分:4)

因为,

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

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

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

答案 1 :(得分:1)

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{..}在主要构造函数之后的中但在次要构造函数之前被调用。

答案 2 :(得分:1)

init 块将在主要构造函数之后立即执行。初始化程序块实际上成为主构造函数的一部分。 构造函数是辅助构造函数。委派给主要构造函数的过程是次要构造函数的第一条语句,因此所有初始化程序块中的代码都在次要构造函数主体之前执行。

示例

class Sample(private var s : String) {
constructor(t: String, u: String) : this(t) {
    this.s += "$u"
}
init {
    s += "B"
}
}

以为您初始化了Sample类

Sample("T","U")

您将在变量 s 上以"TBU"的形式获得字符串响应。 值"T" Sample 类的主要构造函数分配给 s ,然后立即开始执行init块,它将把"B"添加到变量中。在初始化块之后,辅助构造函数块开始执行,并且 s 将变为"TBU"

答案 3 :(得分:0)

如 Kotlin 文档中所述:

<块引用>

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

<块引用>

在实例初始化期间,初始化块按照它们出现在类主体中的相同顺序执行,与属性交错初始值设定项:...

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