上一节说到了Kotlin中的主构造方法和初始化语句块,今天来看看Kotlin中的从构造方法。
在Java中的问题
在Java中,我们有时候为了用不同的参数来创建一个对象,就会声明多个构造方法,也就是构造方法的重载。然后我们可能会让某些构造方法的某些参数为默认值。在Java中是没有主构造方法和从构造方法的概念的,都叫构造方法,就像下面这样。
Java代码
public class User {
private String mName;
private int mAge;
public User(String nickname){
this.mName = nickname;
this.mAge = 10;
}
public User(String nickname, int age){
this.mName = nickname;
this.mAge = age;
}
}
上面的代码的mAge属性在我们不传入时使用默认值10。这样的场景在我们编程中经常遇到,那么在Kotlin中我们又该怎么写呢。
Kotlin中的从构造方法
我们先复习一下Kotlin中的主构造方法和从构造方法的区别。
主构造方法
是主要而简洁的初始化类的方法,声明在类的外部。
从构造方法
是声明在类内部的初始化类的方法。
就如下面的这样。
Kotlin代码
//主构造方法
open class User(val isMan: Boolean){
//从构造方法
constructor(nickname: String) : this(true) {
}
//从构造方法
constructor(nickname: String, age: Int) : this(true) {
}
}
fun main(args: Array<String>){
val user = User("小米", 12);
}
上面的主构造方法使用了val
关键字,这样就是在声明主构造方法的时候为该类声明了一个属性isMan
。
上面定义在类内部的就是从构造方法,为了实现用不同的参数初始化对象,这里定义了两个从构造方法。有人可能对上面的this
的使用存在疑问。上面的this
与Java中一样,用于在同一个类中调用其他的主构造方法或者从构造方法。
还有一个疑问,: this(true)
这个可以不写吗?答案是不可以。因为我们定义了主构造,所以Kotlin中限定我们的从构造方法必须要直接或者间接委托给主构造方法,也就是我们也可以委托给另一个从构造方法,但委托链的最终要委托给主构造方法。
就像下面这样
Kotlin代码
//主构造方法
open class User(val isMan: Boolean){
//从构造方法
constructor(nickname: String) : this(true) {
}
//从构造方法
constructor(nickname: String, age: Int) : this(nickname) {
}
}
代码中constructor(nickname: String, age: Int)
委托了 constructor(nickname: String)
,然后constructor(nickname: String)
又委托给了主构造方法,在这条委托链的末端就是主构造方法。
写在最后
今天的内容很少,就只是单纯说说Kotlin中的从构造方法,这在Java中是没有这个概念的,同时他还介绍了从构造方法的委托规则。