在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是一个可变变量,可以被多次赋值 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和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 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)

和其他语言一样,Var也是一个变量。 如。

var price: Double

另一方面,val提供了引用功能。 如。

val CONTINENTS = 7
// You refer this to get constant value 7. In this case, val acts as access
// specifier final in Java

而且,

val Int.absolute: Int
    get() {
        return Math.abs(this)
    }
// You refer to the newly create 'method' which provides absolute value 
// of your integer

println(-5.absolute) // O.P: 5

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