kotlin

Kotlin-构造函数(2)- 构造函数以及init执行顺序

2021-03-06  本文已影响0人  杨0612
例子
class Test(val name: String) {//1 类名后面定义的主构造函数,数量<=1

    init {//2 init代码块
        println("init")
    }

    private var age: Int? = null

    constructor(name: String, age: Int) : this(name) {//3 次构造函数,数量>=0
        println("second constructor")
        this.age = age
    }
}
反编译看下

因为Kotlin有很多语法糖,在无法直接点击看源码的情况下,可以通过反编译的方式来窥探原理;

public final class Test {
   private Integer age;
   @NotNull
   private final String name;

   @NotNull
   public final String getName() {
      return this.name;
   }

   public Test(@NotNull String name) {//1
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      String var2 = "init";
      boolean var3 = false;
      System.out.println(var2);//2
   }

   public Test(@NotNull String name, int age) {//3
      Intrinsics.checkNotNullParameter(name, "name");
      this(name);
      String var3 = "second constructor";
      boolean var4 = false;
      System.out.println(var3);
      this.age = age;
   }
}
到这里,其实大概就能知道执行顺序了
问题来了

通过次构造函数Test("yang",30)构建对象,age这个属性有值吗?

答案:是没有的,因为age赋值是在init之后。

总结

执行顺序:主构造函数-init代码块-次构造函数。

以上分析有不对的地方,请指出,互相学习,谢谢哦!

上一篇下一篇

猜你喜欢

热点阅读