在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”?因为我问的是与文档中的特定例子有关的疑问,而不仅仅是一般的疑问。


当前回答

在Kotlin中,我们有两种类型的变量:var或val 可在初始化后更新的可变引用(读写)。var 关键字用于定义Kotlin中的变量。它相当于一个普通的(非final) Java变量。如果我们的变量在某个时候需要改变,我们应该这样做 使用var关键字声明它。让我们看一个变量的例子 声明:

 fun main(args: Array<String>) {
     var fruit:String = "orange"  // 1
     fruit = "banana"             // 2
 }

其他回答

瓦尔: 必须添加或初始化值,但不能更改。 var: 它的变量可以在代码中的任何一行中更改。

正常的

Val用于静态字段,就像Java中的静态关键字一样 类似于Java中的Static /与kotlin中的相同 Var在Kotlin中表示可变字段,你可以改变它。 大多数情况下,当你想要一次性在静态内存中保存值时,就会使用Static,

例子:

 if you assign

 val a=1
 a=3  You can not change it 

你不能改变,这是最终值和静态 var b = 2 b=4你可以改变它

你可以简单地把它想成:

Var用于setter(值会改变)。

Val用于getter(只读,值不会改变)。

val和var都可以用于声明变量(局部和类属性)。

局部变量:

Val声明只读变量,只能赋值一次,但不能重新赋值。

例子:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`

var声明了你在Java中知道的可重赋变量(Java 10中将引入关键字“局部变量类型推断”)。

例子:

var reasignableString = “hello”
reasignableString = “c u” // OK

使用val总是更可取的。尽量避免使用var !

类的属性:

这两个关键字还用于在类中定义属性。作为一个例子,看看下面的数据类:

data class Person (val name: String, var age: Int)

Person包含两个字段,其中一个字段是只读(name)。另一方面,年龄可以在类实例化后通过提供的setter重新赋值。注意,name没有相应的setter方法。

把val比作final是错误的!

var是可变的,val是只读的;是的,val不能像Java中的final变量一样被重新赋值,但它们可以随着时间的推移返回不同的值,所以说它们是不可变的是错误的;

考虑以下几点

var a = 10
a = 11 //Works as expected
val b = 10
b = 11 //Cannot Reassign, as expected

到目前为止很好!

现在考虑以下关于val的情况

val d
  get() = System.currentTimeMillis()

println(d)
//Wait a millisecond
println(d) //Surprise!, the value of d will be different both times

因此,vars可以对应于Java中的非最终变量,但val也不是最终变量;

虽然kotlin中有类似final的const,因为它们是编译时常量,没有自定义getter,但它们只适用于原语