本章节讲述Kotlin中init代码块的相关知识
简介
Kotlin中的init代码块用于初始化属性,并执行在创建类的实例时需要运行的代码。它是主要构造函数的一部分,在对象初始化阶段被调用。有点类似于Java中的static代码块,在创建类时就需要初始化的内容。
如果有多个构造函数,无论调用哪个构造函数,init块总是会被执行。
代码
class TestInit(s: String, i: Int) {
var name: String? = null
var age = 0
init {
this.name = s
this.age = i
Log.d("KotlinActivity", "init代码块: $name, $age")
}
}
调用
val entity = TestInit("张三", 20)
Log.d("KotlinActivity", "姓名:${entity.name}")
结果
D/KotlinActivity: init代码块: 张三, 20
D/KotlinActivity: 姓名:张三
kotlin代码编译成java代码
@Metadata(
mv = {1, 5, 1},
k = 1,
d1 = {"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0000\n\u0002\u0010\b\n\u0002\b\f\u0018\u00002\u00020\u0001B\u0015\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006R\u001a\u0010\u0007\u001a\u00020\u0005X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\b\u0010\t\"\u0004\b\n\u0010\u000bR\u001c\u0010\f\u001a\u0004\u0018\u00010\u0003X\u0086\u000e¢\u0006\u000e\n\u0000\u001a\u0004\b\r\u0010\u000e\"\u0004\b\u000f\u0010\u0010¨\u0006\u0011"},
d2 = {"Lcom/example/myapplication/kotlin/TestInit;", "", "s", "", "i", "", "(Ljava/lang/String;I)V", "age", "getAge", "()I", "setAge", "(I)V", "name", "getName", "()Ljava/lang/String;", "setName", "(Ljava/lang/String;)V", "MyApplication.app"}
)
public final class TestInit {
@Nullable
private String name;
private int age;
@Nullable
public final String getName() {
return this.name;
}
public final void setName(@Nullable String var1) {
this.name = var1;
}
public final int getAge() {
return this.age;
}
public final void setAge(int var1) {
this.age = var1;
}
public TestInit(@NotNull String s, int i) {
Intrinsics.checkNotNullParameter(s, "s");
super();
this.name = s;
this.age = i;
Log.d("KotlinActivity", "init代码块: " + this.name + ", " + this.age);
}
}
红框里的内容,就是Kotlin中init代码块中的内容。
总结
Kotlin中的init代码块,相当于Java中的普通代码块,只不过是在构造方法中执行。作用类似于Java中的static代码块。