MST

星途 面试题库

面试题:Kotlin中类的构造函数相关问题

在Kotlin中,主构造函数和次构造函数有什么区别?请举例说明如何在类中正确定义和使用它们,并且阐述主构造函数参数在类属性声明中的作用。
42.8万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

区别

  1. 定义位置与形式
    • 主构造函数:直接定义在类头中,跟在类名之后。例如 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 调用主构造函数,在调用主构造函数后再执行自身的初始化逻辑。

定义与使用示例

  1. 主构造函数
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}")
}
  1. 次构造函数
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)。这种方式简洁高效,避免了在类内部再次声明属性并在构造函数中赋值的冗余操作,直接将参数和属性定义结合起来,同时确定了属性的访问权限。