Val和Var在Kotlin
var
和val
在Kotlin之间有什么区别?
我已经通过这个链接:
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 }
var
和val
什么区别?
为什么我们需要两个?
这不是 Kotlin中variables 的重复 ,与Java的区别。 var vs val? 因为我正在问的是与文件中特定例子有关的疑问,而不仅仅是一般。
在你的代码中, 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 }
val
和java中的final
修饰符是一样的。 正如你应该知道的,我们不能再次分配给final
variables,但可以改变它的属性。
val
和var
都用来声明一个variables。
var就像通用variables,它在kotlin中被称为可变variables,可以被分配多次。
val就像常量variables,它在kotlin中被称为不可变的,并且只能被初始化一次。
有关更多信息什么是val
和var
请参阅下面的链接
用var定义的variables是可变的(读和写)
用val定义的variables是不可变的(只读)
Kotlin可以删除findViewById并减少android studio中setOnClickListener的代码。 充分的参考: Kotlin真棒function
可变variables的值可以随时更改,而不能更改不可变variables的值。
我应该在哪里使用var和val?
使用var值经常改变。 例如,当获取Android设备的位置
var integerVariable : Int? = null
在全class价值没有变化的地方使用val。 例如,你想以编程方式设置文本视图或按钮的文本。
val stringVariables : String = "Button's Constant or final Text"
val
用来声明finalvariables。 val
variables的特征
- 必须初始化
- 价值不能改变或重新分配
var
是一个普通variables
-
稍后我们可以使用
lateinit
修饰符进行初始化[
lateinit
也用于全局variables,我们不能用它作为局部variables] - 价值可以改变或重新分配,但不在全球范围内
val
在kotlin
就像java
final
关键字
简单地说,var(mutable)和val(像Java中的不可变值(final修饰符))
var x:Int=3 x *= x //gives compilation error (val cannot be re-assigned) val y: Int = 6 y*=y
val是immutable
,var在Kotlin中是mutable
的。
val属性与Java中的final属性相似。 您只能为其分配一个值。 当您第二次尝试重新分配一个值时,您将收到一个编译错误。 而var属性是可变的,你可以随意重新分配它,当你想和任何时候你想要的。
简单的认为Val就像java中的finalvariables一样
你可以很容易地认为它是:
var
用于setter(值将会改变)。
val
用于getter(只读,值不会改变)。
如果我们使用val
声明variables,那么它将是只读variables。 我们不能改变它的价值。 这就像Java的最终variables。
但是,如果我们使用var
声明variables,那么它将是一个我们可以读取或写入的variables。 我们可以改变它的价值。
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 }
在这个例子中, result
被声明为地址types的val
。 所以,我们不能改变它的价值。 但是我们改变它的属性值。 那些必须被声明为var
。
你需要改变一个variables还是永久设置? 一个很好的例子,如果它是像“val pi5places = 3.14159”你可以设置为val。 是否有可能需要现在或以后更改该variables,然后将其设置为var。 例如,一辆汽车的颜色,可以是“var colorCar = green”。 稍后,您可以更改colorCar =蓝色,作为一个val,你不能。
这里关于mutable和immutable的回答是好的,但是如果这些术语不是很清楚,或者只是学习如何编程,可能会很吓人。
伟大的文章,以了解val和var在kotlin
http://blog.danlew.net/2017/05/30/mutable-vals-in-kotlin/ – dan lew
两者都是variables唯一的区别是可变的variables和不可变的variables没有什么更多的区别。 var是可变的variables,val是不可变的。简单的语言var可以在初始化后改变值val的值是常量,初始化后不能改变它的值。
val
和var
都可以用来声明variables(local和class属性)。
局部variables :
-
val
声明了不能被重新分配的 只读variables。
例:
val readonlyString = “hello” readonlyString = “cu” // Not allowed for `val`
-
var
声明了可重新分配的variables,就像你从Java中知道的那样(关键字将在Java 10中引入,即“局部variablestypes推断” )。
例:
var reasignableString = “hello” reasignableString = “cu” // OK
总是最好使用val
。 尽量避免var
!
类属性 :
这两个关键字也用于定义类中的属性 。 作为一个例子,看看下面的data class
:
data class Person (val name: String, var age: Int)
Person
包含两个字段,其中一个是只读( name
)。 另一方面, age
可能会在课堂实例化后通过提供的setter
重新分配。 请注意, name
不会有相应的setter方法。
val
(从值):不可变参考。 用val
声明的variables在初始化后不能重新分配。 它对应于Java中的final
variables。
var
(来自variables):可变参考。 这个variables的值可以改变。 这个声明对应于一个常规的(非final)Javavariables。
当我们想声明一个variables时, val
和var
都被使用。 但val
和var
之间的区别是
1.当你声明一个variables为val
不是它的不可变时,这意味着你不能改变它的值(它现在的final
像java一样)
例:-
val value=100 value=200 //compile time error
- 当你声明一个variables为
val
,你必须在声明时初始化variables
例
val value=100 //you have to initialize it here only
但是在var
情况下
- 你可以在声明后初始化variables,但是你必须在声明的时候定义数据types。
例:-
var value:Int //you can initialize it anytime value=100 //initialized here
- 您可以在需要时随时更改其值
例:-
var value=100 value= 200 //changed its value and code will compile happily
variables声明使用val或var,只要它们是不可变的或可变的
Kotlin的一个有趣的事情是,大多数情况下,只要编译器能够推断出它,你就不需要指定正在使用的对象的types。
所以我们只需要根据我们想要生成的variables的types来编写var或val,并且通常可以推断出types。 我们总是可以明确地指定一个types。
Var – variables – 存储在variables中的对象可能会随时间变化(变化)。
Val – Value – 存储在val中的对象不能随时间变化。 一旦赋值val变成只读,就像Java编程语言中的一个常量。 对象的属性(如Val)可以改变,但对象本身是只读的。
fun main(args: Array) { val numberOfHoursInDay = 24 print("Number Of Hours Passed for the day : "+numberOfHoursInDay) // after an hour numberOfHoursInDay = 25 print("\nNumber Of Hours Passed for the day : "+numberOfHoursInDay)}
输出:
错误:(5,5)Kotlin:Val不能被重新分配
我们将研究一个例子,在这个例子中,我们将声明一个对象并尝试改变其属性的值。
fun main(args: Array) { val book = Book("The Last Sun",250) print(book) book.name = "Incredible Hulk" print("\n"+book) } data class Book(var name: String = "", var price: Int = 0)
输出:
书(名字=最后的太阳,价格= 250)书(名字=难以置信的绿巨人,>价格= 250)
val
像constant
variables一样,本身是不能改变的,只能读取,但是val
的属性可以修改; var
就像其他编程语言中的突变variables一样。
var是一个像任何其他语言的variables。 例如。
var price: Double
另一方面,val提供了引用的function。 例如。
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) // OP: 5