MST

星途 面试题库

面试题:Kotlin类与对象基础之构造函数

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

知识考点

AI 面试

面试题答案

一键面试

主构造函数和次构造函数的区别

  1. 定义位置
    • 主构造函数:直接定义在类头中,紧跟类名之后。
    • 次构造函数:在类体内部使用constructor关键字定义。
  2. 初始化时机
    • 主构造函数:类实例化时首先执行,用于类的基本初始化。
    • 次构造函数:在通过该次构造函数创建实例时执行,且在执行次构造函数前会先调用主构造函数(如果有主构造函数)。
  3. 数量限制
    • 主构造函数:一个类最多只能有一个主构造函数。
    • 次构造函数:一个类可以有多个次构造函数。

示例代码

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)定义了主构造函数,它接受nameage两个参数。
  • init块用于在主构造函数执行时进行属性初始化。
  • constructor(name: String) : this(name, 0)定义了一个次构造函数,它调用了主构造函数,并设置默认的age为0。

主构造函数参数在类属性声明中的作用

  1. 直接初始化属性:主构造函数参数可以直接用于初始化类的属性。例如,可以将上述代码简化为:
class Person(val personName: String, val personAge: Int) {
    // 次构造函数
    constructor(name: String) : this(name, 0) {
    }
}

这里通过在主构造函数参数前加上val,Kotlin会自动为其生成对应的属性和getter(如果是var还会生成setter),使得代码更加简洁。 2. 作为属性初始化的基础:即使不自动生成属性,主构造函数参数也为属性初始化提供了值。如最初的示例,通过init块利用主构造函数参数nameage来初始化personNamepersonAge属性。