面试题答案
一键面试区别
- 定义位置与形式
- 主构造函数:直接定义在类头中,跟在类名之后。例如
class Person(val name: String, var age: Int)
,这里(val name: String, var age: Int)
就是主构造函数。它简洁,用于定义类的基本状态。 - 次构造函数:在类内部使用
constructor
关键字定义。例如:
- 主构造函数:直接定义在类头中,跟在类名之后。例如
class Person {
var name: String
var age: Int
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
}
次构造函数可用于提供多种初始化方式。
2. 初始化顺序
- 主构造函数:先执行主构造函数的初始化块,然后执行属性的初始化。
- 次构造函数:如果类有主构造函数,每个次构造函数都必须直接或间接通过 this
调用主构造函数,在调用主构造函数后再执行自身的初始化逻辑。
定义与使用示例
- 主构造函数
class Rectangle(val width: Int, val height: Int) {
val area: Int
get() = width * height
}
fun main() {
val rect = Rectangle(5, 10)
println("Rectangle area: ${rect.area}")
}
- 次构造函数
class Circle {
var radius: Double
constructor(radius: Double) {
this.radius = radius
}
constructor() : this(1.0) {
// 这里可以有额外的初始化逻辑
}
val area: Double
get() = Math.PI * radius * radius
}
fun main() {
val circle1 = Circle(5.0)
val circle2 = Circle()
println("Circle1 area: ${circle1.area}")
println("Circle2 area: ${circle2.area}")
}
主构造函数参数在类属性声明中的作用
主构造函数参数可以直接声明为类的属性。如 class Person(val name: String, var age: Int)
,name
被声明为只读属性(val
),age
被声明为可变属性(var
)。这种方式简洁高效,避免了在类内部再次声明属性并在构造函数中赋值的冗余操作,直接将参数和属性定义结合起来,同时确定了属性的访问权限。