Kotlin里面构造方法执行顺序?


#1
init {
    steps = arrayOf(Step("A", 25f), Step("B", 30f), Step("C", 30f))
}

var steps = emptyArray<Step>()
    set(value)
    {
        field = value
        currentValue = maxValue
        invalidate()
    }

这样执行后steps最后是一个空的数组
kotlin里面是先执行init再执行属性的初始化的吗?


#2

你确定这样倒着写编译得过吗?

字段和init方法是按写的顺序初始化的


#3

可以.没有报错.

public ProgressBarView(@NotNull Context context, @NotNull AttributeSet attrs) {
Intrinsics.checkParameterIsNotNull(context, “context”);
Intrinsics.checkParameterIsNotNull(attrs, “attrs”);
super(context, attrs);
this.paint = new Paint(1);
this.textPaint = new Paint(1);
this.rectF = new RectF();
this.setSteps(new ProgressBarView.Step[]{new ProgressBarView.Step(“A”, 25.0F), new ProgressBarView.Step(“B”, 30.0F), new ProgressBarView.Step(“C”, 30.0F)});
ProgressBarView.Step[] var5 = new ProgressBarView.Step[0];
this.steps = var5;
}

这是反编译以后Java的代码,确实是先执行set方法再初始化的


#4

我的kotlin版本是1.3.10


#5

看上去是合理的,init 写在了 = emptyArray<Step>() 之前了,这个 Java 也是同样的逻辑。另外,你可以写多个 init:


init { ... }

val a = 2

init { ... }


#6

如果你将

init写在了前面那么它就会优先执行.反之也一样.但无论如何主构造函数都是优先执行的


#7

蛤?你不是用的IDEA嘛?

image

这样不报错吗?


京ICP备16022265号-2 Kotlin China 2017 - 2018
本站由腾讯云提供计算服务