Val和Var在Kotlin

varval在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 } 

varval什么区别?

为什么我们需要两个?

不是 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修饰符是一样的。 正如你应该知道的,我们不能再次分配给finalvariables,但可以改变它的属性。

valvar都用来声明一个variables。

var就像通用variables,它在kotlin中被称为可变variables,可以被分配多次。

val就像常量variables,它在kotlin中被称为不可变的,并且只能被初始化一次。

有关更多信息什么是valvar请参阅下面的链接

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

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。 valvariables的特征

  1. 必须初始化
  2. 价值不能改变或重新分配 在这里输入图像说明

var是一个普通variables

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

    [ lateinit也用于全局variables,我们不能用它作为局部variables]

  2. 价值可以改变或重新分配,但不在全球范围内

在这里输入图像说明

valkotlin就像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的值是常量,初始化后不能改变它的值。

valvar都可以用来声明variables(local和class属性)。

局部variables

  1. val声明了不能被重新分配的 只读variables。

例:

 val readonlyString = “hello” readonlyString = “cu” // Not allowed for `val` 
  1. 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中的finalvariables。

var (来自variables):可变参考。 这个variables的值可以改变。 这个声明对应于一个常规的(非final)Javavariables。

当我们想声明一个variables时, valvar都被使用。 但valvar之间的区别是

1.当你声明一个variables为val不是它的不可变时,这意味着你不能改变它的值(它现在的final像java一样)

例:-

 val value=100 value=200 //compile time error 
  1. 当你声明一个variables为val ,你必须在声明时初始化variables

 val value=100 //you have to initialize it here only 

但是在var情况下

  1. 你可以在声明后初始化variables,但是你必须在声明的时候定义数据types。

例:-

 var value:Int //you can initialize it anytime value=100 //initialized here 
  1. 您可以在需要时随时更改其值

例:-

 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)

valconstantvariables一样,本身是不能改变的,只能读取,但是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