Kotlin中的相同属性名称和主要构造函数参数名称

时间:2018-07-11 17:36:52

标签: kotlin

我对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

这背后的原因是什么?为什么我们不能拥有相同的主构造函数的参数名称和属性名称?

4 个答案:

答案 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)  


Student1Student2是完全等效的,但是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}}