在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在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()
}

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

其他回答

var就像一个通用变量,可以被多次赋值,在Kotlin中被称为可变变量。而val是一个常量变量,不能赋值多次,只能初始化一次,在Kotlin中被称为不可变变量。

瓦尔: 分配一次(只读)

Var: Mutable

例子: 定义一个变量来存储userId值:

val userId = 1

如果我们试图改变变量userId,你会得到错误消息

userId = 2
error: val cannot be reassigned // Error message!

让我们创建一个新变量来存储用户名:

var userName = "Nav"

如果你想重新分配userName的值,你可以很容易地做到这一点,因为var是可变的

userName = "Van"

现在userName的值是“Van”。

欲了解更多信息,请访问: https://medium.com/techmacademy/kotlin-101-val-vs-var-behind-the-scenes-65d96c6608bf

在Kotlin中val是不可变的,var是可变的。

Var意味着变量——如果你使用Var存储任何对象,它可能会随着时间而改变。

例如:

fun main(args: Array<String>) {
    var a=12
    var b=13
    var c=12
    a=c+b **//new object 25**
    print(a)
}

Val的意思是值,它就像java中的“常量”。如果你使用Val存储任何对象,它就不能及时改变。

例如:

fun main(args: Array<String>) {
    val a=12
    var b=13
    var c=12
    a=c+b **//You can't assign like that.it's an error.**
    print(a)
}
+----------------+-----------------------------+---------------------------+
|                |             val             |            var            |
+----------------+-----------------------------+---------------------------+
| Reference type | Immutable(once initialized  | Mutable(can able to change|
|                | can't be reassigned)        | value)                    |
+----------------+-----------------------------+---------------------------+
| Example        | val n = 20                  | var n = 20                |
+----------------+-----------------------------+---------------------------+
| In Java        | final int n = 20;           | int n = 20;               |
+----------------+-----------------------------+---------------------------+

参考

在你的代码中,结果没有改变,它的var属性在改变。参考以下评论:

fun copyAddress(address: Address): Address {
    val result = Address() // result is read only
    result.name = address.name // but not their properties.
    result.street = address.street
    // ...
    return result
}

Val与java中的最终修饰符相同。你应该知道,我们不能再给最终变量赋值,但可以改变它的属性。