在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中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 variable是final(不可变)或将来不会改变的常量值
而且
Var变量(可变)可以在未来改变。
class DeliveryOrderEvent(val d : Delivery)
// Only getter
请参阅上面的代码。它是一个模型类,将用于数据传递。我在变量之前设置val,因为这个变量是用来获取数据的。
class DeliveryOrderEvent(var d : Delivery)
// setter and getter is fine here. No error
同样,如果你以后需要设置数据,你需要在变量之前使用var关键字,如果你只需要获得一次值,那么使用val关键字