一、类的构造函数
在Kotlin中,允许有一个主构造函数和多个二级构造函数(辅助构造函数)。其中主构造函数是类头的一部分。
关键字或者构造函数名:constructor(参数)
1、什么时候constructor可以省略
- 在构造函数不具有注释符或者默认的可见性修饰符时,
constructor
关键字可以省略。- 默认的可见性修饰符时
public
。可以省略不写
// 类似下面两种情况的,都必须存在constructor关键字,并且在修饰符或者注释符后面。
class Test private constructor(num: Int){
}
class Test @Inject constructor(num: Int){
}
2、辅助(二级)构造函数
Kotlin中支持二级构造函数。它们以constructor关键字作为前缀。
2.1、声明
class Test{
constructor(参数列表){
}
}
2.2、同时存在主构造函数和二级构造函数时的情况
如果类具有主构造函数,则每个辅助构造函数需要通过另一个辅助构造函数直接或间接地委派给主构造函数。 使用this关键字对同一类的另一个构造函数进行委派:
fun main(args: Array<String>) {
var test1 = Test(1)
var test2 = Test(1,2)
}
// 这里是为了代码清晰,故而没有隐藏constructor关键字
class Test constructor(num: Int){
init {
println("num = $num")
}
constructor(num : Int, num2: Int) : this(num) {
println(num + num2)
}
}
说明:二级构造函数中的参数1(num),是委托了主构造函数的参数num。
可以看出,当实例化类的时候只传1个参数的时候,只会执行init代码块中的代码。当传2个参数的时候,除了执行了init代码块中代码外,还执行了二级构造函数中的代码。
输出结果为:
num = 1
num = 1
3
2.3、当类的主构造函数都存在默认值时的情况
- 在JVM上,如果类主构造函数的所有参数都具有默认值,编译器将生成一个额外的无参数构造函数,它将使用默认值。 这使得更容易使用Kotlin与诸如Jackson或JPA的库,通过无参数构造函数创建类实例。
- 同理可看出,当类存在主构造函数并且有默认值时,二级构造函数也适用
网友评论