在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,你不能。 这里关于可变和不可变的回答很好,但是如果这些术语不是很熟悉或者刚刚开始学习如何编程,可能会很可怕。

其他回答

在Kotlin中,我们使用var来声明变量。它是可变的。我们可以改变,重新分配变量。的例子,

fun main(args : Array<String>){
    var x = 10
    println(x)

    x = 100 // vars can reassign.
    println(x)
}

我们使用val来声明常量。它们是不可变的。无法更改,请重新分配值。Val类似于java中的final变量。的例子,

fun main(args : Array<String>){
    val y = 10
    println(y)

    y = 100 // vals can't reassign (COMPILE ERROR!).
    println(y)
}

在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;

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

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

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

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

Var是一个可变变量。它是一个可以更改为另一个值的变量。这类似于在Java中声明一个变量。

Val是只读的。它类似于java中的final。val在创建时必须初始化。这是因为它在创建之后就不能更改了。

var test1Var = "Hello"
println(test1Var)
test1Var = "GoodBye"
println(test1Var)
val test2Val = "FinalTestForVal";
println(test2Val);