int块和kotln中的构造函数有什么区别?

Sam*_*att 3 android kotlin

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

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

init{
    println("Test")
    }

}
Run Code Online (Sandbox Code Playgroud)

Eug*_*nko 13

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()
Run Code Online (Sandbox Code Playgroud)

当被调用时,它会打印abc. 因此init{..}in主构造函数之后但在辅助构造函数之前调用。


小智 11

自从,

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

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

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


dee*_*raj 5

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

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

认为您使用以下方法初始化了Sample类

Sample("T","U")
Run Code Online (Sandbox Code Playgroud)

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