kotlin 中的构造函数,主要分为 主构造函数 和 次构造函数
- 主构造函数没有函数体,只有一个
- 次构造函数可以有多个,按顺序执行
- 子类继承父类的构造函数,只能在父类的主构造函数和次构造函数中选一个,编译器会提醒子类换成主构造的形式继承。
1.主构造函数
//无参主构造函数
class ConstructorDemo constructor(){
}
//constructor 可以省略
class ConstructorDemo
//如果主构造函数是私有的,不能省略constructor
class ConstructorDemo private constructor()
//如果被注解修饰,不能省略
class ConstructorDemo @JvmOverloads constructor()
//带参数
class ConstructorDemo(val name: String)
带参数的反编译
public final class ConstructorDemo {
@NotNull
private final String name;
@NotNull
public final String getName() {
return this.name;
}
public ConstructorDemo(@NotNull String name) {
Intrinsics.checkNotNullParameter(name, "name");
super();
this.name = name;
}
}
2.init
主构造函数没有函数体,如需要进行初始化操作可以使用 init,进行一些初始化的配置
class ConstructorDemo(var name: String){
init {
name = "Android"
}
}
查看如何实现,相当于直接插入了代码到构造函数
public ConstructorDemo(@NotNull String name) {
Intrinsics.checkNotNullParameter(name, "name");
super();
this.name = name;
Log.d("TAG", "Constructor init");
}
3.次构造函数
需要 constructor 关键字,参数不能和主构造函数一样
class ConstructorDemo(var name: String) {
constructor(name: String, age: Int) : this(name){
Log.d("TAG", "Sencond Constructor")
}
}
反编译,调用了主构造函数,将相关代码放在之后
public ConstructorDemo(@NotNull String name) {
Intrinsics.checkNotNullParameter(name, "name");
super();
this.name = name;
Log.d("TAG", "Constructor init");
}
public ConstructorDemo(@NotNull String name, int age) {
Intrinsics.checkNotNullParameter(name, "name");
this(name);
Log.d("TAG", "Sencond Constructor");
}
4. 执行顺序
open class ConstructorFather(val str: String) {
protected var mAge: Int = 0
init {
Log.d("tag", "Father init")
}
constructor(str: String, age: Int) : this(str) {
Log.d("tag", "Father second constructor")
mAge = age
}
}
class ConstructorDemo : ConstructorFather {
init {
Log.d("TAG", "Child Constructor init")
}
constructor(str: String, age: Int) : super(str, age) {
Log.d("TAG", "Child Sencond Constructor init")
}
}
ConstructorDemo("Android", 14)
打印结果
Father init
Father second constructor
Child Constructor init
Child Sencond Constructor init
先父后子
先init后次构造