Kotlin 里面有主构造方法、init 方法块、次构造方法,那在初始化的时候,它们执行的顺序是怎样的呢?

代码举例:

class Student(
    _name: String,
    val age: Int
) {
    var name = _name
    var score = 10
    private val hobby = "music"
    val subject: String

    init {
        println("initializing student...")
        subject = "math"
    }

    constructor(_name: String) : this(_name, age: 10) {
        score = 20
    }
}

我们将这段代码反编译为 Java 代码:

public Student(@NotNull String _name, int age) {
    Intrinsics.checkParameterIsNotNull(_name, "_name");
    super();
    this.age = age;
    this.name = _name;
    this.score = 10;
    this.hobby = "music";
    String var3 = "initializing student...";
    boolean var4 = false;
    System.out.println(var3);
    this.subject = "math";
}

public Student(@NotNull String _name) {
    Intrinsics.checkParameterIsNotNull(_name, "_name");
    this(_name, age:10);
    this.score = 20;
}

可以发现:主构造函数里面的 age 属性最先被赋值,然后再是类级别的属性:name、score、hobby 被赋值,随后是 init 代码块里面的逻辑被执行,最后是次构造函数里面的逻辑被执行

对应关系:

结论:Kotlin 中创建对象时的初始化顺序:

  • 主构造函数里声明的属性
  • 类级别别的属性赋值
  • init 初始化块里的属性赋值和函数调用
  • 次构造函数里的属性赋值和函数调用

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐