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


当前回答

在你的代码中,结果没有改变,它的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中的最终修饰符相同。你应该知道,我们不能再给最终变量赋值,但可以改变它的属性。

其他回答

正常的

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你可以改变它

在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声明变量,那么它将是只读变量。我们不能改变它的值。它就像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 is a Immutable constant 
    val change="Unchange" println(change)
    //It will throw error because val is constant variable
    // change="Change" 
    // println(change)
Var is a Mutable constant
    var name: String="Dummy"
    println(name)
    name="Funny"
    println(name)

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