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

标签 kotlin

我对Kotlin如何管理属性名称和主要构造函数参数名称有些困惑。如果我写了相同的属性名称和参数名称,那么kotlin编译器将给出错误。

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的参数的名称时,该代码将起作用并进行编译。

这将正常工作或编译。
class Student(pName : String, roll : Int){
    val name: String

    init {
        name = "Asif"
    }
}

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

最佳答案

在属性初始值设定项和初始值设定项块中提供了主要的构造函数参数(这使主要的构造函数具有特殊性)。

init块中,name指的是构造函数参数,与所有其他函数参数一样,该参数不能重新分配。这是第二个错误。第一个是出于相同的原因,现在您的属性未在任何地方初始化。

如果要初始化属性,仍可以将其称为this.name:

class Student(name : String, roll : Int){
    val name: String

    init {
        this.name = "Asif"
    }
}

关于kotlin - Kotlin中的相同属性名称和主要构造函数参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51291355/

相关文章:

string - 如何在原始(多行)Kotlin 字符串中使用美元符号 '$'?

java - try-with-resources:Kotlin 中的 "use"扩展功能并不总是有效

Kotlin 构造函数委托(delegate)给内部数据类?

Jetpack Compose 中的 android:autoSizeTextType

java - Android 中的动画启动屏幕,无需制作启动 Activity

java - 错误:DexGuard Gradle插件:不支持Android Gradle插件版本。 (4.0.0),受支持的版本包括[2.3.0:3.6。*]

ios - 导入gradle插件生成的cocoapods时,Xcode显示快速的编译器错误

java - 无法添加任务 ':jacocoTestReport',因为同名任务已存在

android - 如何将 Jetpack Compose 中的 TextStyle 转换为 android.graphics.Typeface?

android - 将 LiveData<Resource<User>> 转换为 LiveData<User> 时的类型干扰问题