Kotlin的Val和Var

Aks*_*tel 246 kotlin

varvalKotlin有什么区别?

我已经通过这个链接:

https://kotlinlang.org/docs/reference/properties.html

如此链接所述:

只读属性声明的完整语法与可变的两种方式不同:它以val而不是var开头,不允许使用setter.

但就在有一个使用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
}
Run Code Online (Sandbox Code Playgroud)

var和之间的确切区别是val什么?

为什么我们两个都需要?

不是KotlinVariables 的重复,与Java的差异.var vs val?因为我在询问有关文档中特定示例的疑问,而不仅仅是一般性的.

cha*_*l03 201

在你的代码result没有改变,它的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
}
Run Code Online (Sandbox Code Playgroud)

valfinaljava中的修饰符相同.您应该知道我们不能final再次分配给变量但可以更改其属性.

  • @Nothing 不,到处都是一样的。 (3认同)

Pat*_*kal 117

valvar两个用于声明的变量.

var就像一般变量,它在kotlin中被称为可变变量,可以多次分配.

val类似于常量变量,在kotlin中称为不可变,只能单次初始化.

有关详细信息val,var请参阅以下链接

http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/


use*_*056 21

var定义的变量是可变的(读和写)

val定义的变量是不可变的(只读)

Kotlin可以删除findViewById并减少android studio中setOnClickListener的代码.完整参考:Kotlin很棒的功能

可变变量的值可以随时更改,而不能更改不可变变量的值.

我应该在哪里使用var和val?

使用var,其中值经常变化.例如,在获取Android设备的位置时

var integerVariable : Int? = null
Run Code Online (Sandbox Code Playgroud)

使用val,全班的价值没有变化.例如,您需要以编程方式设置textview或按钮的文本.

val stringVariables : String = "Button's Constant or final Text"
Run Code Online (Sandbox Code Playgroud)

  • "Kotlin可以删除findViewById并减少android studio中setOnClickListener的代码.完整参考:Kotlin很棒的功能"这与问题有什么关系? (13认同)
  • val变量不一定是不变的。它们是最终的-只有引用是不可变的-但是如果val中存储的对象是可变的,则无论对象是通过val还是var赋值,该对象都是可变的。 (3认同)

小智 15

val用于声明最终变量.val变量的特征

  1. 必须初始化
  2. 价值无法更改或重新分配 在此输入图像描述

var 是一般变量

  1. 我们可以稍后使用lateinit修饰符进行初始化

    [ lateinit也用于全局变量我们不能将它用于局部变量]

  2. 值可以更改或重新分配,但不能在全局范围内

在此输入图像描述

valin kotlin就像final关键字 一样 java


Sam*_*iya 11

val是immutable和var mutable在Kotlin.


hus*_*yin 10

简单地说,var(mutable)和val(Java中的不可变值(final modifier))

var x:Int=3
x *= x

//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y
Run Code Online (Sandbox Code Playgroud)


Con*_*oid 9

简单地认为Val就像java中的final变量


Job*_*ews 9

+----------------+-----------------------------+---------------------------+
|                |             val             |            var            |
+----------------+-----------------------------+---------------------------+
| Reference type | Immutable(once initialized  | Mutable(can able to change|
|                | can't be reassigned)        | value)                    |
+----------------+-----------------------------+---------------------------+
| Example        | val n = 20                  | var n = 20                |
+----------------+-----------------------------+---------------------------+
| In Java        | final int n = 20;           | int n = 20;               |
+----------------+-----------------------------+---------------------------+
Run Code Online (Sandbox Code Playgroud)

参考


小智 7

您可以轻松地将其视为:

var 用于设置器(值将更改)。

val 用于吸气剂(只读,值不会改变)。


ARG*_*Geo 7

在Kotlin val中,它是一个只读属性,并且只能由getter访问。val是一成不变的。

val 例如:

val piNumber: Double = 3.1415926
    get() = field
Run Code Online (Sandbox Code Playgroud)

但是,它var读写属性,因此它不仅可以由getter进行访问,还可以由setter进行访问。var是可变的。

var 例如:

var gravity: Double = 9.8
    get() = field
    set(value) { 
        field = value 
    }    
Run Code Online (Sandbox Code Playgroud)

如果您尝试更改不可变的内容val,IDE将显示错误:

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

// RESULT:   Val cannot be reassigned 
Run Code Online (Sandbox Code Playgroud)

但是可变的var可以更改:

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

// RESULT:   0.0
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


小智 7

var就像一般变量一样,可以被多次赋值,在 Kotlin 中被称为可变变量。而val是常量变量,不能多次赋值,只能初始化一次,在 Kotlin 中被称为不可变变量。

\n

值: \n分配一次(只读)

\n

变量: \n可变

\n

示例:\n定义一个变量来存储 userId 值:

\n
val userId = 1\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们尝试更改变量 userId 您将收到错误消息

\n
userId = 2\nerror: val cannot be reassigned // Error message!\n
Run Code Online (Sandbox Code Playgroud)\n

让\xe2\x80\x99s 创建一个新变量来存储用户名:

\n
var userName = "Nav"\n
Run Code Online (Sandbox Code Playgroud)\n

如果你想重新分配 userName 的值,你可以轻松地做到这一点,因为 var 是可变的

\n
userName = "Van"\n
Run Code Online (Sandbox Code Playgroud)\n

现在 userName 的值为“Van”。

\n

有关更多信息,请访问:\n https://medium.com/techmacademy/kotlin-101-val-vs-var-behind-the-scenes-65d96c6608bf

\n


Sau*_*kar 6

变量的值val只能分配一次。

val address = Address("Bangalore","India")
address = Address("Delhi","India") // Error, Reassigning is not possible with val
Run Code Online (Sandbox Code Playgroud)

虽然您无法重新分配该值,但您当然可以修改该对象的属性。

//Given that city and country are not val
address.setCity("Delhi") 
address.setCountry("India")
Run Code Online (Sandbox Code Playgroud)

这意味着您无法更改变量指向的对象引用,但可以更改该变量的基础属性。

var 变量的值可以根据需要多次重新分配。

var address = Address("Bangalore","India")
address = Address("Delhi","India") // No Error , Reassigning possible.
Run Code Online (Sandbox Code Playgroud)

显然,只要不声明 val,它的底层属性就可以更改。

//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")
Run Code Online (Sandbox Code Playgroud)


小智 6

基本上

  • var= 变量,因此可以更改
  • val= value,因此它不能更改。


Vis*_*bre 6

val决赛相比是错误的!

vars 是可变的 vals 是只读的;是的,val 不能像 Java 中的 final 变量一样重新分配,但它们可以随着时间的推移返回不同的值,所以说它们是不可变的是错误的;

考虑以下

var a = 10
a = 11 //Works as expected
Run Code Online (Sandbox Code Playgroud)
val b = 10
b = 11 //Cannot Reassign, as expected
Run Code Online (Sandbox Code Playgroud)

所以太好了!

现在考虑以下vals

val d
  get() = System.currentTimeMillis()

println(d)
//Wait a millisecond
println(d) //Surprise!, the value of d will be different both times
Run Code Online (Sandbox Code Playgroud)

因此,var 可以对应于 Java 中的非最终变量,但 val 也不完全是最终变量;

尽管const在 kotlin 中可以像final,因为它们是编译时常量并且没有自定义 getter,但它们仅适用于原语


Avi*_*kar 5

如果我们使用声明变量,val则它将是只读变量。我们无法改变它的价值。就像Javafinal变量一样。是。immutable

但是,如果我们使用声明变量,var那么它将是一个我们可以读取写入的变量。我们可以改变它的价值。是mutable

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
}
Run Code Online (Sandbox Code Playgroud)

val不能最近通过关键字初始化,lateinit但非基本类型var可以最近通过关键字初始化lateinit


小智 5

您需要更改变量还是永久设置它?

  • 一个很好的例子,如果它类似于val pi5places = 3.14159,您可以将其设置为val。如果您现在或以后需要更改该变量,那么您可以将其设置为 var。

  • 例如:汽车的颜色可以是var colorCar = green。稍后你可以改变这一点colorCar = blue,而作为一个val,你不能。

  • 这里关于mutable和 的回应immutable很好,但如果这些术语不为人所知或者刚刚开始学习如何编程,可能会很可怕。