我对Kotlin如何管理属性名称和主要构造函数参数名称感到困惑。如果我写了相同的属性名称和参数名称,那么kotlin编译器将显示错误。
array([[ 0. , 93.43955419],
[93.43955419, 0. ]])
出现此错误。
class Student(name : String, roll : Int){
val name: String
init {
name = "Asif"
}
}
但是当我更改属性> Error:(9, 5) Kotlin: Property must be initialized or be abstract
> Error:(12, 9) Kotlin: Val cannot be reassigned
的名称或更改主构造函数val name : String
的参数的名称时,代码将起作用并编译。
这可以正常工作或编译。
name : String
这背后的原因是什么?为什么我们不能拥有相同的主构造函数的参数名称和属性名称?
答案 0 :(得分:4)
主构造函数参数在属性初始值设定项和初始值设定项块中可用(这是使主构造函数特别之处的原因)。
在init
块中,name
指的是构造函数参数,该参数与所有其他函数参数一样不能重新分配。这是第二个错误。第一个是出于相同的原因,现在您的属性未在任何地方初始化。
如果要初始化属性,仍可以将其称为this.name
:
class Student(name : String, roll : Int){
val name: String
init {
this.name = "Asif"
}
}
答案 1 :(得分:0)
Init块提供来自默认构造函数的参数。要分配对象的name
字段,您必须显式使用this.name
:
class Student(name : String, roll : Int){
val name: String
init {
this.name = "Asif"
}
}
但是更多的方式是直接在构造函数中声明具有默认值的字段:
class Student(val name : String = "DefaultName", roll : Int){ }
答案 2 :(得分:0)
答案是由其他人提供的,但请澄清以下版本:
(a)
class Student1(name : String, roll : Int){
val name: String
init {
this.name = "Asif"
}
}
(b)
class Student2(name : String, roll : Int){
val name: String = "Asif"
}
(c)
class Student3(val name : String = "DefaultName", roll : Int)
类Student1
和Student2
是完全等效的,但是Student3
不是:
如果运行以下代码:
val s = Student1("Nick", 2)
println(s.name)
val s2 = Student2("Nick", 2)
println(s2.name)
val s3 = Student3("Nick", 2)
println(s3.name)
您将看到:
Asif
Asif
Nick
答案 3 :(得分:0)
科特琳提供如下简洁明了的方式:
class Student(var name : String, roll : Int){
init {
name = "Asif"
}
}
已复制: 实际上,对于声明属性并从主构造方法初始化它们,Kotlin具有简洁的语法。 { {3}}