【问题标题】:What is the difference between init block and constructor in kotlin?kotlin 中的 init 块和构造函数有什么区别?
【发布时间】:2019-08-16 19:37:57
【问题描述】:

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

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

    init {
        println("Test")
     }    
}

【问题讨论】:

标签: kotlin constructor initialization-block


【解决方案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{..} 主构造函数之后但在辅助构造函数之前调用。

【讨论】:

  • 那么,如果我们有一个二级构造函数,init块会调用第一个还是二级构造函数呢?我们不能在主构造函数中初始化值。对吗?
  • 谢谢,我在答案中添加了一个示例
  • “您可以在其中放置更多将在 属性初始化后运行的代码” 这是不正确的。实际上“初始化块的执行顺序与它们在类主体中出现的顺序相同,与属性初始化器交错”。要查看差异,请将 val a 移到 init 块之后。
【解决方案2】:

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 处得到一个字符串响应,即"TBU"。 值"T"Sample 类的主构造函数中赋值给s,然后init 块立即开始执行,它会将"B" 添加到变量中。 init block 后二级构造函数块开始执行,s 将变为"TBU"

【讨论】:

    【解决方案3】:

    因为,

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

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

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

    【讨论】:

      【解决方案4】:

      如 Kotlin 文档中所述:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多