Kotlin类构造函数参数的默认值类型是什么?

3
class Greeter(name: String) {

    fun greet() {
       println("Hello, $name")
    }
}

fun main(args: Array<String>) {
    Greeter(args[0]).greet()
}

对于上面的程序,我得到了以下错误。
Unresolved reference: name

但是当我添加 var 或者 val

class Greeter(var name: String) {

或者

class Greeter(val name: String) {

这个程序本来就可以正常工作,那么为什么我需要在名称前添加var或val?构造函数参数的默认类型是什么,为什么当我没有提到var或val时程序会报错?


5
如果添加了 valvar,那么该参数也成为了一个属性。如果没有这两个关键字,那么该参数只是一个参数,在初始化期间才可以访问。详情请参见 https://kotlinlang.org/docs/reference/classes.html#constructors。 - Slaw
3个回答

1

添加val或var会使参数成为属性,并可以在整个类中访问。如果没有这样做,它只能在init{}内部访问。


1

要在构造函数中使用您的值,例如 class Greeter(name: String),您可以使用 init {}。

class Greeter(name: String) {
    var string:name = ""
    init{
        this.name = name
    }

   fun greet() {
       println("Hello, $name")
    }
}

如果您在构造函数中使用val或var,则更像是类级别变量,可以在类的任何地方访问。
class Greeter(var name:String){
    fun greet() {
       println("Hello, $name")
    }
}

变量名称可以直接在类中使用。我们也可以在两种情况下为变量提供默认值。

2
不必使用init{},它也可以直接在初始化器中使用(var _name = name)。 - Alexey Romanov

0
这个问题本身没有意义,但你所面临的问题确实有意义。在你的情况下,你所采用的方法是错误的:
错误的方式:
// here name is just a dependency/value which will be used by the Greeter
// but since it is not assigned to any class members,
// it will not be accessible for member methods 
class Greeter(name: String) {
  fun greet(){} // can not access the 'name' value
}

正确的方法:

// here name is passed as a parameter but it is also made a class member
// with the same name, this class member will immutable as it is declared as 'val'
class Greeter(val name: String) {
  fun greet(){} // can access the 'name' value
}

你也可以将val替换为var,使name成为一个可变的类成员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接