面试题答案
一键面试主构造函数和次构造函数的区别
- 定义位置:
- 主构造函数:直接定义在类头中,紧跟类名之后。
- 次构造函数:在类体内部使用
constructor
关键字定义。
- 初始化时机:
- 主构造函数:类实例化时首先执行,用于类的基本初始化。
- 次构造函数:在通过该次构造函数创建实例时执行,且在执行次构造函数前会先调用主构造函数(如果有主构造函数)。
- 数量限制:
- 主构造函数:一个类最多只能有一个主构造函数。
- 次构造函数:一个类可以有多个次构造函数。
示例代码
class Person constructor(name: String, age: Int) {
// 主构造函数参数用于初始化属性
val personName: String
val personAge: Int
// 主构造函数中初始化属性
init {
this.personName = name
this.personAge = age
}
// 次构造函数
constructor(name: String) : this(name, 0) {
// 这里可以有额外的初始化逻辑
}
}
在上述代码中:
class Person constructor(name: String, age: Int)
定义了主构造函数,它接受name
和age
两个参数。init
块用于在主构造函数执行时进行属性初始化。constructor(name: String) : this(name, 0)
定义了一个次构造函数,它调用了主构造函数,并设置默认的age
为0。
主构造函数参数在类属性声明中的作用
- 直接初始化属性:主构造函数参数可以直接用于初始化类的属性。例如,可以将上述代码简化为:
class Person(val personName: String, val personAge: Int) {
// 次构造函数
constructor(name: String) : this(name, 0) {
}
}
这里通过在主构造函数参数前加上val
,Kotlin会自动为其生成对应的属性和getter(如果是var
还会生成setter),使得代码更加简洁。
2. 作为属性初始化的基础:即使不自动生成属性,主构造函数参数也为属性初始化提供了值。如最初的示例,通过init
块利用主构造函数参数name
和age
来初始化personName
和personAge
属性。