Val and Var in Kotlin
Kotlin中的
我已经浏览了以下链接:
https://kotlinlang.org/docs/reference/properties.html网站
如本链接所述:
The full syntax of a read-only property declaration differs from a
mutable one in two ways: it starts with val instead of var and does
not allow a setter.
号
但在前面有一个使用setter的例子。
1 2 3 4 5 6 7 | 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 } |
为什么我们两者都需要?
这不是Kotlin中变量的重复,与Java的区别。Var与Val?正如我所问的,与文档中的特定示例相关的疑问,而不仅仅是一般疑问。
在您的代码中,
1 2 3 4 5 6 7 | 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 } |
EDCX1的2Ω与Java中的EDCOX1×3修改器相同。正如您可能知道的那样,我们不能再为
var is like general variable and it's known as a mutable variable in kotlin and can be assigned multiple times.
val is like Final variable and it's known as immutable in kotlin and can be initialized only single time.
号
更多信息,请参见下面的链接。
http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/
号
编辑:从"val像常量"到"val像最终值"
用var定义的变量是可变的(读和写)
用val定义的变量是不可变的(只读)
Kotlin可以删除findViewByID并减少Android Studio中setOnClickListener的代码。完整参考:Kotlin Awesome Features
可变变量的值可以随时更改,但不能更改不可变变量的值。
我应该在哪里使用var,在哪里使用val?
在值经常变化的地方使用var。例如,在获取Android设备的位置时
1 | var integerVariable : Int? = null |
。
如果整个类中的值没有变化,则使用val。例如,您希望以编程方式设置文本视图或按钮的文本。
1 | val stringVariables : String ="Button's Constant or final Text" |
稍后我们可以使用
[
氧化镁
Val为
简单地认为VAL就像Java中的最终变量
简单地说,var(可变)和VAL(Java中的不可变值(最终修饰符))
1 2 3 4 5 6 | var x:Int=3 x *= x //gives compilation error (val cannot be re-assigned) val y: Int = 6 y*=y |
。
你可以很容易地认为:
1 2 3 4 5 6 7 8 9 10 | +----------------+-----------------------------+---------------------------+ | | 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; | +----------------+-----------------------------+---------------------------+ |
参考
基本上
Var =变量,因此可以更改Val =value,所以不能改变。一个很好的例子,如果它类似于val pi5places=3.14159,那么您可以将其设置为
val 。是否有可能需要现在或以后更改该变量,然后将其设置为var。例如:汽车的颜色,可以是
var colorCar = green 。稍后您可以更改colorCar = blue ,其中作为val ,您不能更改。这里关于
mutable 和immutable 的回答是好的,但如果这些术语不为人所知或只是学习如何编程,可能会很可怕。- 声明阅读-只可变,只能指定一次,但不能重写。
- 如你所知,Java的变量是可读取的(关键词将引入Java 10,"局部变量类型推理")。
-
如常数变量,可实现,且可改变阀的性能。
-
Var just like a mutable variable.你可以随时改变价值。
EDOCX1·0是用于EDCOX1,1域,在Java中作为EDCOX1,2
与爪哇中的EDOCX1·1一样/与KOTLIN相同
Var 表示Kotlin中的变量字段,您可以更改它。当您希望立即在静态内存中保存值时,通常使用
static ,您不能更改,这是最终值和静态值
埃多克斯1〔6〕
b=4 U可以更改它- 当你声明一个变量,如EDOCX1&0时
- 您可以在声明后初始化变量,但您必须在声明时定义数据类型。
- 当需要时,你可以改变它的价值。
小精灵
In Kotlin
val is a read-only property and it can be accessed by a getter only.val is immutable.
号
1 2 | val piNumber: Double = 3.1415926 get() = field |
号
However,
var is a read-and-write property, so it can be accessed not only by a getter but a setter as well.var is mutable.
号
1 2 3 4 5 | var gravity: Double = 9.8 get() = field set(value) { field = value } |
号如果试图更改不可变的
1 2 3 4 5 6 | fun main() { piNumber = 3.14 // ERROR println(piNumber) } // RESULT: Val cannot be reassigned |
号但是一个可变的
1 2 3 4 5 6 | fun main() { gravity = 0.0 println(gravity) } // RESULT: 0.0 |
号
希望这有帮助。
如果我们使用
但是如果我们使用
1 2 3 4 5 6 7 8 9 10 11 | 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属性与Java中的最终属性类似。您只能为其分配一次值。当您尝试用第二次的值重新分配它时,您将得到一个编译错误。而var属性是可变的,您可以根据自己的意愿随时重新分配它。
如EDOCX1,25,Variable,ITSELF不能改变,只能读,但EDOCX1,0的性能可以修改;就像其他编程语言中的突变变量。
可用于申报变量(本地和类别性质)。
本地变量:
Example:
1 2 | val readonlyString ="hello" readonlyString ="c u" // Not allowed for `val` |
Example:
ZZU1
使用EDOCX1总是比较好。尽量避免,尽量避免
类别属性:
两个关键词也被用于命令定义类内的属性。以
1 | data class Person (val name: String, var age: Int) |
包括两个领域,其中一个是现实的(EDOCX1&8)。在另一手上,可以通过提供的EDOCX1[…]10,在课后阅读。注:元没有相应的设置方法。
var–variable–存储在变量中的对象可能会随时间变化(变化)。
val–value–存储在val中的对象,不能随时间变化。一旦被分配,VAR就变成只读,就像Java编程语言中的常量一样。
例如:
1 2 3 4 5 6 7 8 | fun main(args:Array<String>){ var numberOfHoursPassed=3 print("Number of hours passed: $numberOfHoursPassed") //After 10 hours numberOfHoursPassed=13 //value of var can be changed print("Number of hours passed: $numberOfHoursPassed") } |
输出:
1 2 | Number of hours passed: 3 Number of hours passed: 13 |
号
如果我们将任何值重新分配给val,则会发生编译错误,例如,
错误:–VAL无法重新分配。
综上所述,VaR可以在任何水平上改变。然而,一旦分配了VAL,就不能更改,但可以更改其属性。
参考:https://www.tutorialkart.com/kotlin/val-vs-var-in-kotlin/
VAL是不可逆转的,最终,第一指定值不能改变。
1 2 3 | val name:String ="andy" name ="thomas" //Error: Val cannot be reassigned |
Var是可变异的,可转换的,你可以改变价值。
1 2 3 4 5 6 | val a:Int = 1 var b:Int = 1 println("${a + b}") // output 2 b = 4 println("${a + b}") // output 5 |
I think the easiest way to remember it :
val = variable final
var = variable reassignable, or the opposite of val.
两个变量都被用作初始化
1 2 | val address = Address("Bangalore","India") address = Address("Delhi","India") // Error, Reassigning is not possible with val |
虽然您不能重新分配值,但是您当然可以修改对象的属性。
1 2 3 | //Given that city and country are not val address.setCity("Delhi") address.setCountry("India") |
。
这意味着您不能更改变量指向的对象引用,但可以更改该变量的基础属性。
var变量的值可以根据需要多次重新分配。
1 2 | var address = Address("Bangalore","India") address = Address("Delhi","India") // No Error , Reassigning possible. |
号
显然,它的底层属性可以更改,只要它们没有声明为val。
1 2 3 | //Given that city and country are not val address.setCity("Delhi") address.setCountry("India") |
号
正常的
小精灵
例子:
1 2 3 4 | if you assign val a=1 a=3 You can not change it |
小精灵
简而言之,VAL变量是最终的(不是可变的)或将来不会改变的常量值。和var变量(可变)将来可以更改。
1 2 | class DeliveryOrderEvent(val d : Delivery) // Only getter |
。
见上述代码。它是一个模型类,将用于数据传递。我在变量之前设置了VAL,因为这个变量用于获取数据。
1 2 3 | class DeliveryOrderEvent(var d : Delivery) // setter and getter is fine here. No error |
。
另外,如果以后需要设置数据,则需要在变量之前使用var关键字,如果只需要获取一次值,则使用val关键字。
瓦尔:必须添加或初始化值,但无法更改。var:它的变量可以在代码的任何行中更改。
让我们试试这个方法。
1 2 3 4 5 6 7 8 9 10 | 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到Java得到了确切的答案。
如果你在科特林这样做:
1 2 | data class UsingVarAndNoInit(var name: String) data class UsingValAndNoInit(val name: String) |
您将获得使用许可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | package classesiiiandiiiobjects.dataiiiclasses.p04variiiandiiival; import kotlin.jvm.internal.Intrinsics; import org.jetbrains.annotations.NotNull; public final class UsingVarAndNoInit { @NotNull private String name; @NotNull public final String getName() { return this.name; } public final void setName(@NotNull String string) { Intrinsics.checkParameterIsNotNull((Object) string, (String)"<set-?>"); this.name = string; } public UsingVarAndNoInit(@NotNull String name) { Intrinsics.checkParameterIsNotNull((Object) name, (String)"name"); this.name = name; } @NotNull public final String component1() { return this.name; } @NotNull public final UsingVarAndNoInit copy(@NotNull String name) { Intrinsics.checkParameterIsNotNull((Object) name, (String)"name"); return new UsingVarAndNoInit(name); } @NotNull public static /* bridge */ /* synthetic */ UsingVarAndNoInit copy$default( UsingVarAndNoInit usingVarAndNoInit, String string, int n, Object object) { if ((n & 1) != 0) { string = usingVarAndNoInit.name; } return usingVarAndNoInit.copy(string); } public String toString() { return"UsingVarAndNoInit(name=" + this.name +")"; } public int hashCode() { String string = this.name; return string != null ? string.hashCode() : 0; } public boolean equals(Object object) { block3: { block2: { if (this == object) break block2; if (!(object instanceof UsingVarAndNoInit)) break block3; UsingVarAndNoInit usingVarAndNoInit = (UsingVarAndNoInit) object; if (!Intrinsics.areEqual((Object) this.name, (Object) usingVarAndNoInit.name)) break block3; } return true; } return false; } } |
。
您还将获得使用许可证:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package classesiiiandiiiobjects.dataiiiclasses.p04variiiandiiival; import kotlin.jvm.internal.Intrinsics; import org.jetbrains.annotations.NotNull; public final class UsingValAndNoInit { @NotNull private final String name; @NotNull public final String getName() { return this.name; } public UsingValAndNoInit(@NotNull String name) { Intrinsics.checkParameterIsNotNull((Object) name, (String)"name"); this.name = name; } @NotNull public final String component1() { return this.name; } @NotNull public final UsingValAndNoInit copy(@NotNull String name) { Intrinsics.checkParameterIsNotNull((Object) name, (String)"name"); return new UsingValAndNoInit(name); } @NotNull public static /* bridge */ /* synthetic */ UsingValAndNoInit copy$default( UsingValAndNoInit usingValAndNoInit, String string, int n, Object object) { if ((n & 1) != 0) { string = usingValAndNoInit.name; } return usingValAndNoInit.copy(string); } public String toString() { return"UsingValAndNoInit(name=" + this.name +")"; } public int hashCode() { String string = this.name; return string != null ? string.hashCode() : 0; } public boolean equals(Object object) { block3: { block2: { if (this == object) break block2; if (!(object instanceof UsingValAndNoInit)) break block3; UsingValAndNoInit usingValAndNoInit = (UsingValAndNoInit) object; if (!Intrinsics.areEqual((Object) this.name, (Object) usingValAndNoInit.name)) break block3; } return true; } return false; } } |
这里有更多的例子:https://github.com/tomasbjerre/yet-another-kotlin-vs-java-comparison
当我们想申报一个变量时,都使用了这两种方法。但
当你宣布变量为
Example:
1 2 3 | val value=100 value=200 //compile time error |
示例
1 | val value=100 //you have to initialize it here only |
但以
Example:
1 2 3 | var value:Int //you can initialize it anytime value=100 //initialized here |
Example:
1 2 3 | var value=100 value= 200 //changed its value and code will compile happily |
Var是一个可变的变量,可以被分配多次时间。而VAL是不可改变的变量,只能在一次时间内起爆。
(一次初始化不能重写)
可改变值
示例
In Kotlin-Val N=20&Amp N=20
In Java-FINAL INT N=20& INT N=20;
Var被用于创建那些变量,这些变量的价值将在您应用的时间范围内改变。这与SWIFT的不同,在SWIFT的不同,在SWIFT的不同之处,在SWIFT的不同之处,在SWIFT的应用中,VAL被用于创建那些值不会改变的变量,它与SWIFT的相同。
两者都是变量,唯一的区别是可变变量和不变变量,没有什么区别。var是可变变量,val是不可变的。在简单语言中,var可以在初始化后更改is value,val是常量,并且在初始化后不能更改它的值。
Var means variable-if you stored any object using var it could change in time.
For example:
1 2 3 4 5 6 7 | fun main(args: Array<String>) { var a=12 var b=13 var c=12 a=c+b **//new object 25** print(a) } |
Val means value-it's like a constant in Java if you stored any object using val it couldn't change in time.
For example:
1 2 3 4 5 6 7 | fun main(args: Array<String>) { val a=12 var b=13 var c=12 a=c+b **//You can't assign like that.it's an error.** print(a) } |
我们使用EDOCX1宣布一个变量。这是易变的。我们可以改变,变量。Example,
1 2 3 4 5 6 7 | fun main(args : Array<String>){ var x = 10 println(x) x = 100 // vars can reassign. println(x) } |
我们使用公路宣布君士坦丁斯。他们是不可逆转的。无法改变Java变量与EDOCX1类似。Example,
1 2 3 4 5 6 7 | fun main(args : Array<String>){ val y = 10 println(y) y = 100 // vals can't reassign (COMPILE ERROR!). println(y) } |
var和其他语言一样是一个变量。如。
1 | var price: Double |
号
另一方面,val为您提供了引用功能。如。
1 2 3 | val CONTINENTS = 7 // You refer this to get constant value 7. In this case, val acts as access // specifier final in Java |
而且,
1 2 3 4 5 6 7 8 | 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 |
。