MST

星途 面试题库

面试题:Kotlin构造函数中主构造函数与次构造函数的区别

请详细阐述Kotlin中主构造函数和次构造函数在定义方式、初始化时机、参数使用等方面的区别,并举例说明。
10.7万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试

定义方式

  1. 主构造函数
    • 主构造函数是类头的一部分,紧跟在类名之后。它可以有参数,也可以没有参数。如果主构造函数没有任何注解或者可见性修饰符,可以省略constructor关键字。
    • 示例:
class Person(val name: String, var age: Int) {
    // 类体
}

这里(val name: String, var age: Int)就是主构造函数的参数列表,valvar表示参数会自动声明为属性。

  1. 次构造函数
    • 次构造函数使用constructor关键字在类体中定义。
    • 示例:
class Person {
    var name: String
    var age: Int

    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }
}

这里定义了一个次构造函数constructor(name: String, age: Int)

初始化时机

  1. 主构造函数
    • 主构造函数的初始化逻辑在初始化块(init块)中执行。init块会在类实例化时,在属性初始化之后立即执行。
    • 示例:
class Person(val name: String, var age: Int) {
    init {
        println("Initializing Person with name $name and age $age")
    }
}

当创建Person实例时,init块中的代码会执行。

  1. 次构造函数
    • 次构造函数必须直接或间接调用主构造函数。在调用主构造函数之后,才会执行次构造函数自身的代码。
    • 示例:
class Person(val name: String, var age: Int) {
    constructor(name: String) : this(name, 0) {
        println("Initializing Person with only name $name, age set to 0")
    }
}

这里的次构造函数constructor(name: String)先调用了主构造函数this(name, 0),然后执行自身的打印逻辑。

参数使用

  1. 主构造函数
    • 主构造函数的参数可以直接声明为属性(使用valvar),这些属性在整个类中都可以直接访问。
    • 示例:
class Person(val name: String, var age: Int) {
    fun introduce() {
        println("Hi, I'm $name and I'm $age years old.")
    }
}

这里nameageintroduce函数中可以直接使用。

  1. 次构造函数
    • 次构造函数的参数不会自动成为属性。如果需要使用这些参数,要么将其赋值给类中已声明的属性,要么在次构造函数内部使用。
    • 示例:
class Person {
    var name: String
    var age: Int

    constructor(name: String, age: Int) {
        this.name = name
        this.age = age
    }

    fun introduce() {
        println("Hi, I'm $name and I'm $age years old.")
    }
}

这里次构造函数的参数nameage需要手动赋值给类的属性才能在其他函数中使用。