Kotlin中的constructor()是主要构造函数吗?

时间:2018-07-23 07:47:30

标签: android kotlin

这些是主要的构造函数代码A,对吗?

constructor()是代码B中的主要构造函数吗?

代码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
    }

}

4 个答案:

答案 0 :(得分:3)

在Kotlin中,主构造函数是类标头的一部分:它位于类名(和可选的类型参数)之后。

Classes And Inheritance的官方文档中了解更多信息。

因此,类B没有定义主构造函数。

答案 1 :(得分:2)

主要构造函数是标头中描述的构造函数,无论它只是由类名后面的括号标记还是由显式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
}

如果您根本没有主构造函数,那么您的辅助构造函数没有义务互相调用。如果没有一个没有参数的人,他们只需要调用超类构造函数即可。

答案 2 :(得分:1)

  1. 不,它不是Primary构造函数。
  

Kotlin中的一个类可以有一个主构造函数和一个或多个   二级构造函数。主构造函数是该类的一部分   标头:位于类名(和可选的类型参数)之后。

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

答案 3 :(得分: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中阅读更多内容