在Kotlin中var和val的区别是什么?

我已经通过了这个链接:

属性和字段

如本连结所述:

只读属性声明的完整语法不同于 可变1有两种方式:它以val开头,而不是var 不允许设置。

但在此之前有一个使用setter的例子。

fun copyAddress(address: Address): Address {
    val result = Address() // there's no 'new' keyword in Kotlin
    result.name = address.name // accessors are called
    result.street = address.street
    // ...
    return result
}

var和val的确切区别是什么?

为什么我们两者都需要?

这不是Kotlin中的变量的副本,与Java的区别:'var'和。“val”?因为我问的是与文档中的特定例子有关的疑问,而不仅仅是一般的疑问。


当前回答

你需要改变一个变量还是永久设置它?

一个很好的例子,如果它是val pi5places = 3.14159,你会把它设置为val。如果你现在或以后需要改变这个变量,那么你会把它设置为var。 例如:一辆车的颜色,可以是var colorCar = green。之后你可以改变colorCar = blue,作为一个val,你不能。 这里关于可变和不可变的回答很好,但是如果这些术语不是很熟悉或者刚刚开始学习如何编程,可能会很可怕。

其他回答

虽然我迟到了,但有一点我还没发现。你可以使用val在when表达式中赋值一个局部变量,但是尝试使用var会产生编译器错误:

sealed class Token {
    data class StringToken(val value: String) : Token()
    data class BoolToken(val value: Boolean) : Token()
}

fun getToken() : Token = Token.BoolToken(true)

val output = when (val token = getToken()) {
    is Token.StringToken -> token.value
    is Token.BoolToken -> token.value.toString()
}

这允许您访问右边表达式中正确的类型推断值。

如果我们使用val声明变量,那么它将是只读变量。我们不能改变它的值。它就像Java的最终变量。它是不可变的。

但如果我们使用var声明变量,那么它将是一个我们可以读或写的变量。我们可以改变它的值。这是可变的。

data class Name(val firstName: String, var lastName: String)

fun printName(name: Name): Name {
    val myName = Name("Avijit", "Karmakar") // myName variable is read only
    // firstName variable is read-only. 
    //You will get a compile time error. Val cannot be reassigned.
    myName.firstName = myName.firstName
    // lastName variable can be read and write as it's a var.
    myName.lastName = myName.lastName
    return myName
}

Val不能最近通过关键字lateinit初始化,但非原始变量可以最近通过关键字lateinit初始化。

Val (from value): 不可变的参考。用val声明的变量是不可以的 在初始化后重新赋值。它对应于Java中的最后一个变量。

Var (from variable): 可变参考。这样一个变量的值是可以改变的。 此声明对应于一个常规(非final) Java变量。

Val和var都用于声明变量。

Var就像一般变量,它在kotlin中被称为可变变量,可以被多次赋值。 val类似于Final变量,它在kotlin中是不可变的,只能初始化一次。

有关什么是val和var的更多信息,请参见下面的链接

http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/

在kotlin中,我们可以用两种类型声明变量:val和var。 Val不能重新赋值,它作为最终变量。

val x = 2
x=3 // cannot be reassigned

另一方面,var可以被重新赋值它是可变的

var x = 2
x=3 // can be reassigned