这些是主要的构造函数代码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
}
}
答案 0 :(得分:3)
答案 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)
Kotlin中的一个类可以有一个主构造函数和一个或多个 二级构造函数。主构造函数是该类的一部分 标头:位于类名(和可选的类型参数)之后。
答案 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中阅读更多内容