在 Kotlin 中,constructor() 是主构造函数吗?

4

这是一个主构造函数,对吗?

在代码B中,constructor()是主构造函数吗?

在代码B中没有主构造函数吗?

代码A

class Person constructor(firstName: String) {
}

代码 B

class Person {
    var name: String = ""

    constructor()  // Is this a primary constructor

    constructor(name:String):this(){
        this.name = name
    }

}

代码 C

class Person {
    var name: String = ""
    constructor(name:String){
        this.name = name
    }

}

请查看此链接:https://kotlinlang.org/docs/reference/classes.html - user8959091
4个回答

5
在Kotlin中,主构造函数是类头的一部分:它在类名称(和可选类型参数)之后。请参阅官方文档中的Classes And Inheritance了解更多信息。因此,B类没有定义主构造函数。

谢谢!在代码B中,我必须写constructor(name:String):this(){...}吗?而在代码C中只需要写constructor(name:String){...}吗? - HelloCW
@HelloCW 不需要。constructor(name:String) { this.name = name }就足够了,因为没有主构造函数。 - Naetmul
附加说明:在官方文档中,“如果主构造函数没有任何注释或可见性修饰符,则可以省略构造函数关键字。”因此,如果您声明了任何访问修饰符或注释,则不能省略“constructor”关键字。 - TeachMeJava

3

主构造函数是在类名后面加上括号或使用明确的constructor关键字描述的。主构造函数之所以特殊,是因为它的参数可以用于初始化块和属性初始化器。这就是为什么你必须从每个次要构造函数(如果主构造函数存在)调用主构造函数 - 否则,你可能会得到一个半初始化的类实例。例如:

class MyClass(x: String) {
    val length = x.length

    constructor() : this("foo") {
        println("secondary constructor used!")
    }
}

如果您有一个主构造函数,次构造函数必须最终调用主构造函数以便进行适当的初始化。这可以直接或间接地发生,甚至通过多个步骤:
class MyClass(x: String) {
    val length = x.length

    constructor(x: Int) : this(x.toString()) // calls primary ctor
    constructor(x: Long) : this(x.toInt()) // calls previous secondary ctor with Int param
    constructor(x: Double) : this(x.toLong()) // calls previous secondary ctor with Long param
}

当然,两个次要构造函数不能相互调用:
class MyClass {
    constructor(x: Int) : this(x.toLong()) // Error: There's a cycle in the delegation calls chain
    constructor(x: Long) : this(x.toInt()) // Error: There's a cycle in the delegation calls chain
}

如果你没有主构造函数,那么你的次要构造函数就没有任何必要互相调用。它们只需要调用超类构造函数,如果没有不带参数的超类构造函数。


1
  1. 不是主构造函数。

Kotlin中的类可以有一个主构造函数和一个或多个辅助构造函数。主构造函数是类头的一部分:它在类名(可选类型参数后)之后。

  1. 是的,没有主构造函数。

1

只有代码 A 是主要构造函数

代码 B 和 C 是次要构造函数

代码 A

class Person constructor(firstName: String) { //primary constructor
}

代码 B

class Person {
    var name: String = ""

    constructor()  // secondary constructor

    constructor(name:String):this(){  // secondary constructor
        this.name = name
    }

}

代码 C

class Person {
    var name: String = ""
    constructor(name:String){// secondary constructor
        this.name = name
    }

}

阅读更多:KotlinPage


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接