Вал и Вар в Котлине

В чем разница между var а также val в Котлине?

Я прошел по этой ссылке:

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

Как указано по этой ссылке:

Полный синтаксис объявления свойства только для чтения отличается от изменяемого в двух отношениях: он начинается с val вместо var и не допускает установки.

Но перед этим есть пример, который использует сеттер.

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, отличия от Java. вар против вал? как я спрашиваю о сомнениях, связанных с конкретным примером в документации, а не только в целом.

50 ответов

Решение

В вашем коде 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 такой же как final Модификатор в Java. Как вы, вероятно, должны знать, что мы не можем назначить final переменная снова, но может изменить свои свойства.

val а также var оба используются для объявления переменной.

var подобен общей переменной и известен как изменяемая переменная в kotlin и может быть назначен несколько раз.

val подобен постоянной переменной и известен как неизменяемый в kotlin и может быть инициализирован только один раз.

Для получения дополнительной информации, что это val а также var пожалуйста, смотрите ссылку ниже

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

Переменные, определенные с помощью var, являются изменяемыми (чтение и запись)

переменные, определенные с помощью val, являются неизменяемыми (только для чтения)

Kotlin может удалить findViewById и уменьшить код для setOnClickListener в андроид студии. Для полной справки: Kotlin потрясающие функции

Значение изменяемых переменных может быть изменено в любое время, в то время как вы не можете изменить значение неизменяемых переменных.

где я должен использовать var и где val?

используйте var, где значение часто меняется. Например, при получении местоположения устройства Android

var integerVariable : Int? = null

используйте val, где нет изменений в значении во всем классе. Например, вы хотите установить текстовое представление или текст кнопки программно.

val stringVariables : String = "Button's Constant or final Text"

val использовать для объявления окончательной переменной. Характеристики val переменные

  1. Должен быть инициализирован
  2. значение не может быть изменено или переназначено введите описание изображения здесь

var как общая переменная

  1. Мы можем инициализировать позже, используя lateinit модификатор

    [lateinit также использовать для глобальной переменной, мы не можем использовать ее для локальной переменной]

  2. значение может быть изменено или переназначено, но не в глобальной области видимости

введите описание изображения здесь

val в kotlin как final ключевое слово в java

Валь immutable и вар это mutable в Котлине.

+----------------+-----------------------------+---------------------------+
|                |             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 используется для получения (только для чтения, значение не изменится).

Проще говоря, 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 до финала неправильно!

vars изменчивы vals доступны только для чтения; Да, val нельзя переназначить так же, как переменные final из Java, но они могут возвращать другое значение с течением времени, поэтому говорить, что они неизменяемы, неправильно;

Рассмотрим следующие

var a = 10
a = 11 //Works as expected
val b = 10
b = 11 //Cannot Reassign, as expected

Так что хорошо!

Теперь рассмотрим следующее для vals

val d
  get() = System.currentTimeMillis()

println(d)
//Wait a millisecond
println(d) //Surprise!, the value of d will be different both times

Следовательно, vars могут соответствовать нефинальным переменным из Java, но val тоже не совсем конечные переменные;

Хотя есть const в котлине, что может быть похоже final, поскольку они являются константами времени компиляции и не имеют специального получателя, но работают только с примитивами

Просто подумайте, что Val, как окончательная переменная в Java

В принципе

  • var = переменная, поэтому она может измениться
  • val = значение, поэтому оно не может измениться.

Если мы объявим переменную, используя val тогда это будет переменная только для чтения. Мы не можем изменить это значение. Это как финальная переменная Java. Это 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
}

val не может быть инициализирован в последнее время по ключевому слову lateinit но не примитивно var может быть инициализирован в последнее время по ключевому слову lateinit,

В котлине val это свойство только для чтения, доступ к которому может получить только получатель. val неизменен.

val пример:

val piNumber: Double = 3.1415926
    get() = field

Тем не мение, var является свойством чтения и записи, поэтому к нему может обращаться не только получатель, но и установщик. var изменчиво

var пример:

var gravity: Double = 9.8
    get() = field
    set(value) { 
        field = value 
    }    

Если вы попытаетесь изменить неизменный val, IDE покажет вам ошибку:

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

// RESULT:   Val cannot be reassigned 

Но изменчивый var может быть изменено:

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

// RESULT:   0.0

Надеюсь это поможет.

var похож на общую переменную и может быть назначен несколько раз и известен как изменяемая переменная в Kotlin. В то время как val является постоянной переменной и не может быть назначена несколько раз и может быть инициализирована только один раз и известна как неизменяемая переменная в Kotlin.

Val: назначается один раз (только чтение)

Вар: изменчивый

пример: определить переменную для хранения значения userId:

      val userId = 1

если мы пытаемся изменить переменную userId, вы получите сообщение об ошибке

      userId = 2
error: val cannot be reassigned // Error message!

Создадим новую переменную для хранения имени пользователя:

      var userName = "Nav"

если вы хотите переназначить значение userName, вы можете легко это сделать, потому что var является изменяемым

      userName = "Van"

и теперь значение userName - «Ван».

Для получения дополнительной информации посетите это:https://medium.com/techmacademy/kotlin-101-val-vs-var-behind-the-scenes-65d96c6608bf

Значение для val Переменная может быть назначена только один раз.

val address = Address("Bangalore","India")
address = Address("Delhi","India") // Error, Reassigning is not possible with val

Хотя вы не можете переназначить значение, но вы, безусловно, можете изменить свойства объекта.

//Given that city and country are not val
address.setCity("Delhi") 
address.setCountry("India")

Это означает, что вы не можете изменить ссылку на объект, на который указывает переменная, но базовые свойства этой переменной могут быть изменены.

Значение переменной var можно переназначать столько раз, сколько вы хотите.

var address = Address("Bangalore","India")
address = Address("Delhi","India") // No Error , Reassigning possible.

Очевидно, что лежащие в его основе свойства могут быть изменены, если они не объявлены как val.

//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")

Вам нужно изменить переменную или установить ее навсегда? Хороший пример, если это что-то вроде "val pi5places = 3.14159", вы бы установили его как val. Есть ли вероятность, что вам нужно изменить эту переменную сейчас или позже, тогда вы бы установили ее как var. Например, цвет автомобиля, может быть "var colorCar = green". Позже вы можете изменить это colorCar = синий, где, как val, вы не можете.

Ответы здесь относительно изменчивости и неизменности хороши, но могут быть пугающими, если эти термины не очень хорошо известны или только начинают изучать, как программировать.

Свойствоval похоже на конечное свойство в Java. Вам разрешено присваивать ему значение только один раз. Когда вы попытаетесь переназначить его значением во второй раз, вы получите ошибку компиляции. Принимая во внимание, что свойство var является изменяемым, и вы можете переназначить его, когда пожелаете и в любое время.

Обе переменные используются в качестве инициализации

  • val, как постоянная переменная, может быть читаемым, а свойства val могут быть изменены.

  • var как изменяемая переменная Вы можете изменить значение в любое время.

вар:

  • Объявите переменную, значение которой можно изменить в любой момент.
  • Обычно это используется для объявления переменной с глобальной областью действия.
  • Его можно переназначить.
  • Его объем не подлежит повторному объявлению.

вал:

  • Он используется для определения констант во время выполнения. Основное отличие от const.
  • Его нельзя переназначить в своей области действия.
  • Его объем не подлежит повторному объявлению.
  • Объявление имеет область действия блочной функции.

Два способа создания переменных в KOTLIN VAL и VAR

1.VAL хранит постоянные значения. Также называется финальной переменной

2.VAR хранит изменяемые значения

Нажмите здесь для примера

Var означает переменную - если вы сохранили какой-либо объект, используя 'var', он может измениться со временем.

Например:

fun main(args: Array<String>) {
    var a=12
    var b=13
    var c=12
    a=c+b **//new object 25**
    print(a)
}

Val означает значение. Это похоже на "константу" в Java . Если вы сохранили какой-либо объект, используя "val", он не может измениться во времени.

Например:

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 лайк constant переменная, сама не может быть изменена, только может быть прочитана, но свойства val могут быть изменены;var точно так же как переменная мутанта в других языках программирования.

val неизменяемый, окончательный, первое назначенное значение не может быть изменено.

val name:String = "andy"

name = "thomas" //Error: Val cannot be reassigned

var изменяемый, переназначаемый, вы можете изменять значение снова и снова.

val a:Int = 1
var b:Int = 1
println("${a + b}") // output 2

b = 4
println("${a + b}") // output 5

Я думаю, что самый простой способ запомнить это:

val = переменная final

переменная = переназначаемая переменная или противоположность val.

Переменные объявляются с использованием val или var, при условии, что они являются неизменяемыми или изменяемыми

Интересной особенностью Kotlin является то, что в большинстве случаев вам не нужно указывать тип объектов, с которыми вы работаете, если компилятор может это определить.

Таким образом, нам просто нужно написать var или val в зависимости от типа переменной, которую мы хотим сгенерировать, и тип обычно выводится. Мы всегда можем указать тип явно.

Var - Variable - Объект, хранящийся в переменной, может изменяться (изменяться) во времени.

Val - Value - Объект, хранящийся в val, не может изменяться во времени. После присвоения val становится только для чтения, как константа в языке программирования Java. Свойства объекта (как Val) могут быть изменены, но сам объект доступен только для чтения.

fun main(args: Array<String>) {
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 не может быть переназначен

Мы рассмотрим пример, в котором мы объявим объект в val и попробуем изменить значения его свойств.

fun main(args: Array<String>) {
    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)

Var — изменяемая переменная. Это переменная, которую можно изменить на другое значение. Это похоже на объявление переменной в Java.

Val доступен только для чтения. Это похоже на final в java. Значение должно быть инициализировано при его создании. Это связано с тем, что его нельзя изменить после создания.

      var test1Var = "Hello"
println(test1Var)
test1Var = "GoodBye"
println(test1Var)
val test2Val = "FinalTestForVal";
println(test2Val);

val (из значения): Неизменная ссылка. Переменная, объявленная с val не может быть переназначен после инициализации. Это соответствует final переменная в Java.

var (из переменной): изменяемая ссылка. Значение такой переменной можно изменить. Это объявление соответствует обычной (не финальной) переменной Java.

val: должен добавить или инициализировать значение, но не может измениться.var: эта переменная может изменяться в любой строке кода.

Короче говоря, переменная val является конечной (не изменяемой) или постоянной величиной, которая не будет изменена в будущем, а переменная var (изменяемой) может быть изменена в будущем.

class DeliveryOrderEvent(val d : Delivery)
// Only getter

Смотрите приведенный выше код. Это модельный класс, будет использоваться для передачи данных. Я установил val перед переменной, потому что эта переменная использовалась для получения данных.

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

Также, если вам нужно установить данные позже, вам нужно использовать ключевое слово var перед переменной, если вам нужно получить значение только один раз, тогда используйте ключевое слово val

В котлине мы можем объявить переменную двух типов: val а также var.val не может быть переназначен, он работает как конечная переменная.

val x = 2
x=3 // cannot be reassigned

С другой стороны, var можно переназначить, он изменяемый

var x = 2
x=3 // can be reassigned

VAR используется для создания тех переменных, значение которых будет меняться с течением времени в вашем приложении. Это то же самое, что VAR для swift, тогда как VAL используется для создания переменных, значение которых не изменится с течением времени в вашем приложении. Это то же самое, что LET для swift.

Другие вопросы по тегам