Kotlin的Val和Var

Val and Var in Kotlin

Kotlin中的varval有什么区别?

我已经浏览了以下链接:

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
}

varval的确切区别是什么?

为什么我们两者都需要?

这不是Kotlin中变量的重复,与Java的区别。Var与Val?正如我所问的,与文档中的特定示例相关的疑问,而不仅仅是一般疑问。


在您的代码中,result没有更改,其var属性正在更改。参考以下评论:

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修改器相同。正如您可能知道的那样,我们不能再为final变量赋值,但可以更改其属性。


valvar都用于声明变量。

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变量的特征

  • 必须初始化
  • 无法更改或重新分配值enter image description here
  • var是一个通用变量。

  • 稍后我们可以使用lateinit修饰符初始化

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

  • 值可以更改或重新分配,但不在全局范围内
  • 氧化镁

    kotlin中的valjava中的final关键字相似。


    Val为immutable,Var为Kotlin中的mutable


    简单地认为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


    你可以很容易地认为:

    var用于setter(值将改变)。

    val用于getter(只读,值不变)。


    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,所以不能改变。
    • 小精灵


      In Kotlin val is a read-only property and it can be accessed by a getter only. val is immutable.

      Val示例:

      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.

      Var示例:

      1
      2
      3
      4
      5
      var gravity: Double = 9.8
          get() = field
          set(value) {
              field = value
          }

      号如果试图更改不可变的Val,则IDE将显示错误:

      1
      2
      3
      4
      5
      6
      fun main() {    
          piNumber = 3.14          // ERROR
          println(piNumber)
      }

      // RESULT:   Val cannot be reassigned

      号但是一个可变的Var可以改变:

      1
      2
      3
      4
      5
      6
      fun main() {    
          gravity = 0.0
          println(gravity)
      }

      // RESULT:   0.0

      希望这有帮助。


      如果我们使用val声明变量,那么它将是只读变量。我们不能改变它的价值。它就像Java的最终变量。我是immutable

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

      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最近不能用关键字lateinit初始化,但非原语var最近可以用关键字lateinit初始化。


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

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

      • 例如:汽车的颜色,可以是var colorCar = green。稍后您可以更改colorCar = blue,其中作为val,您不能更改。

      • 这里关于mutableimmutable的回答是好的,但如果这些术语不为人所知或只是学习如何编程,可能会很可怕。

      • 小精灵


        VAL属性与Java中的最终属性类似。您只能为其分配一次值。当您尝试用第二次的值重新分配它时,您将得到一个编译错误。而var属性是可变的,您可以根据自己的意愿随时重新分配它。


        如EDOCX1,25,Variable,ITSELF不能改变,只能读,但EDOCX1,0的性能可以修改;就像其他编程语言中的突变变量。


        可用于申报变量(本地和类别性质)。

        本地变量:

      • 声明阅读-只可变,只能指定一次,但不能重写。
      • Example:

        1
        2
        val readonlyString ="hello"
        readonlyString ="c u" // Not allowed for `val`
      • 如你所知,Java的变量是可读取的(关键词将引入Java 10,"局部变量类型推理")。
      • Example:

        ZZU1

        使用EDOCX1总是比较好。尽量避免,尽量避免

        类别属性:

        两个关键词也被用于命令定义类内的属性。以data class为例:

        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.


        两个变量都被用作初始化

        • 如常数变量,可实现,且可改变阀的性能。

        • Var just like a mutable variable.你可以随时改变价值。


        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")


        正常的

        • EDOCX1·0是用于EDCOX1,1域,在Java中作为EDCOX1,2

        • 与爪哇中的EDOCX1·1一样/与KOTLIN相同

        • Var表示Kotlin中的变量字段,您可以更改它。

        • 当您希望立即在静态内存中保存值时,通常使用static

        • 小精灵

          例子:

          1
          2
          3
          4
           if you assign

           val a=1
           a=3  You can not change it
          • 您不能更改,这是最终值和静态值

            埃多克斯1〔6〕

            b=4U可以更改它

          • 小精灵


            简而言之,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


            当我们想申报一个变量时,都使用了这两种方法。但valvar的区别在于

            当你宣布变量为val时,意味着你不能改变它的价值(它的final)

            Example:

            1
            2
            3
            val value=100

            value=200 //compile time error
          • 当你声明一个变量,如EDOCX1&0时
          • 示例

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

            但以var为例

          • 您可以在声明后初始化变量,但您必须在声明时定义数据类型。
          • 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)
            }

            val(from value):不可逆转的参考A variable declared with val在它初始化之后重新阅读。在爪哇的变量。

            var(变量):可变异参考这种变量的价值可以改变。这项宣言是一项经常(非最终)变量。


            我们使用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