在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是不可变的,final,第一个赋值不能改变。

val name:String = "andy"

name = "thomas" //Error: Val cannot be reassigned

Var是可变的,可重赋的,你可以反复改变它的值。

val a:Int = 1
var b:Int = 1
println("${a + b}") // output 2

b = 4
println("${a + b}") // output 5

我认为最简单的记忆方法是: Val =变量final Var =变量可重赋,或val的相反。

其他回答

在Kotlin中val是一个只读属性,它只能被getter访问。Val是不可变的。

Val例子:

val piNumber: Double = 3.1415926
    get() = field

然而,var是一个读写属性,因此它不仅可以由getter访问,还可以由setter访问。Var是可变的。

Var示例:

var gravity: Double = 9.8
    get() = field
    set(value) { 
        field = value 
    }    

如果你试图改变一个不可变的val, IDE会显示错误:

fun main() {    
    piNumber = 3.14          // ERROR
    println(piNumber)
}

// RESULT:   Val cannot be reassigned 

但是可变的var可以被改变:

fun main() {    
    gravity = 0.0
    println(gravity)
}

// RESULT:   0.0

val -不可变(初始化后不能重新赋值)

var - Mutable(可以改变值)

例子

在 Kotlin 中 - val n = 20 & var n = 20

在Java - final int n = 20;& int n = 20;

Var是一个可变变量,可以被多次赋值 val是不可变变量,只能初始化一次。

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方法。

你可以简单地把它想成:

Var用于setter(值会改变)。

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