美文网首页工作生活
kotlin代码初始化顺序

kotlin代码初始化顺序

作者: 冷师傅_ | 来源:发表于2019-07-09 22:18 被阅读0次

kotlin的代码初始化顺序其实我们DeCompile一下就可以看的明明白白了,先来看两个类,子类Sheep和父类Animal,找个地方初始化Sheep即可:

open class Animal(name: String) {
    open var name: String = "I'm a Animal"
        set(value) {
            field = value
        }
        get() = field

    init {
        this.name = "My Name is Animal from init block!"
        init()
    }

    open fun init() {
        name = "My Name is Animal from init function!"
    }

}
class Sheep : Animal("Sheep") {
    override var name = "I'm a Sheep"
        set(value) {
            field = value
        }
        get() = field

    init {
        this.name = name
    }

    override fun init() {
        super.init()
        this.name = "My Name is Sheep from init function!"
    }
}

最后上一个Decompile kotlin的文件看一下应该对执行顺序有所了解了。

@Metadata(
   mv = {1, 1, 15},
   bv = {1, 0, 3},
   k = 1,
   d1 = {"\u0000\u001a\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0002\b\u0002\n\u0002\u0010\u000e\n\u0002\b\u0006\n\u0002\u0010\u0002\n\u0000\u0018\u00002\u00020\u0001B\u0005¢\u0006\u0002\u0010\u0002J\b\u0010\n\u001a\u00020\u000bH\u0016R&\u0010\u0005\u001a\u00020\u00042\u0006\u0010\u0003\u001a\u00020\u00048V@VX\u0096\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\u0006\u0010\u0007\"\u0004\b\b\u0010\t¨\u0006\f"},
   d2 = {"Lcom/example/lw/grouphelper/Sheep;", "Lcom/example/lw/grouphelper/Animal;", "()V", "value", "", "name", "getName", "()Ljava/lang/String;", "setName", "(Ljava/lang/String;)V", "init", "", "app_debug"}
)
public final class Sheep extends Animal {
   @NotNull
   private String name = "I'm a Sheep";

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

   public void setName(@NotNull String value) {
      Intrinsics.checkParameterIsNotNull(value, "value");
      this.name = value;
   }

   public void init() {
      super.init();
      this.setName("My Name is Sheep from init function!");
      Log.e("Sheep", this.getName());
   }

   public Sheep() {
      super("Sheep");
      this.setName(this.getName());
      Log.e("Sheep", this.getName());
   }
}
  • 1.首先是父类的变量name被赋值,注意:赋值的状态是Animal.name,而不是name或者this.name,并且在Debug状态下,断点不会停在赋值的位置,我也不知道原因在哪里。
  • 2.接着是父类Animalinit{}初始化代码块。
  • 3.当name被赋值的时候,因为变量的继承关系,调用的是子类里nameset方法。
  • 4.Sheepinit()函数。
  • 5.Animalinit()函数。
  • 6.Sheepnameset函数。
  • 7.最后是Sheepinit{}

总结
1.父类变量的赋值操作是最先被调用的,像Animal.name,在initializer block之前已经有值了:

屏幕快照 2019-07-09 下午9.48.05.png
2.子类的init{}总是最后被调用。
3.因为变量的继承关系,子类中重写的变量的赋值总是调用子类相应变量的set方法,而不是父类的。

相关文章

  • kotlin代码初始化顺序

    kotlin的代码初始化顺序其实我们DeCompile一下就可以看的明明白白了,先来看两个类,子类Sheep和父类...

  • Kotlin笔记

    Kotlin与Java的差异 1. 对象的初始化时的顺序 在java中,初始化代码块 -> 构造函数 在kotli...

  • Kotlin记录

    1. kotlin类的调用顺序调用顺序 答:变量初始化 --> init{} --> constractor{} ...

  • java类初始化机制

    初始化顺序 无继承类初始化 初始化顺序静态变量/静态代码块 -> 成员变量/代码块 -> 构造函数其中,静态变量与...

  • 2020-05-19

    go 文件代码初始化顺序

  • 对象的初始化顺序

    分析代码来源:胖胖-对象初始化顺序 结论: 首先指出初始化顺序不一定严格按照以上顺序进行,如果静态代码块写在静态变...

  • Java中类的加载顺序

    以前对类的加载顺序,静态变量的初始化,普通变量的初始化,构造函数的初始化,构造代码块,静态代码块的初始化顺序一直搞...

  • kotlin类的构造函数和属性(2)

    一、init初始化代码块 二、初始化顺序,包含init测试

  • 2019-02-23

    Kotlin 中构造顺序 结果Chen1Chen12 构造函数的执行顺序①先执行值域的直接初始化②然后执行init...

  • Kotlin 类和对象

    原文地址:Kotlin 类和对象 一、类定义 Kotlin 类可以包含:构造函数、初始化代码块、函数、属性、内部类...

网友评论

    本文标题:kotlin代码初始化顺序

    本文链接:https://www.haomeiwen.com/subject/lizrhctx.html