Вал і Вар у Котліні


289

Яка різниця між 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?

Навіщо нам потрібно обоє?

Це не є дублікатом з змінних в Котлин, відмінності з Java. var vs val? тому що я запитую про сумніви, пов’язані з конкретним прикладом у документації, а не лише загалом.


4
resultне може бути змінено для посилання на інший екземпляр Address, але екземпляр, на який він посилається, все одно може бути змінений. Те саме було б і на Яві, якби у вас бувfinal Address result = new Address();
Майкл


Сюди прийшов відповідь, оскільки веб-сайт Котліна,
AndroidDev

Відповіді:


239

У вашому коді 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знову призначити змінну, але можемо змінити її властивості.


1
val і var у функції та класи або в первинному конструкторі мають різний зміст?

3
@Нічого Ні, скрізь його те саме.
chandil03

Але коли я оголошую змінну з var у класі, вона вимагала ініціалізації, оскільки вона оголошує властивість. Але у функції це не вимагало ініціалізації, чому?

Тому що, коли клас завантажується в пам'ять, його властивості також оцінюються. Але у функції змінні оцінюються, коли виконується код функції.
chandil03

Його значення всередині функції або всередині класу як ключове слово, valі varвони використовуються для оголошення властивостей? не змінна?

142

valі varобидва використовуються для оголошення змінної.

var - як загальна змінна, і вона відома як змінна змінна в kotlin і може бути призначена кілька разів.

val - це як остаточна змінна, і вона відома як незмінна в kotlin і може бути ініціалізована лише один раз.

Для отримання додаткової інформації про те, що це таке, valі varдивіться нижче за посиланням

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


23

змінні, визначені з var, змінюються (Read and Write)

змінні, визначені val, незмінні (лише для читання)

Kotlin може видалити findViewById та зменшити код для setOnClickListener в студії Android. Для повної довідки: приголомшливі функції Котліна

Значення змінних змінних можна змінити в будь-який час, тоді як ви не можете змінити значення незмінних змінних.

де я повинен використовувати var і де val?

використовувати var, де значення часто змінюється. Наприклад, отримуючи місце розташування пристрою Android

var integerVariable : Int? = null

використовуйте val там, де в цілому класі не змінюється значення. Наприклад, ви хочете програмно встановити перегляд тексту або текст кнопки.

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

17
"Kotlin може видалити findViewById та зменшити код для setOnClickListener в андроїд-студії. Для повної довідки: Котлінські дивовижні функції" Наскільки це стосується заданого питання?
denvercoder9

4
Змінні val не обов'язково незмінні. Вони є остаточними - лише посилання є незмінним, але якщо об'єкт, що зберігається у валі, є змінним, об'єкт може змінюватися незалежно від того, призначений він через val чи var.
Тревіс

я не бачу сенсу вводити два нові ключові слова, хоча це можна було зробити набагато краще, зрозуміло раніше, на Java
ruben

18

valвикористовувати для оголошення остаточної змінної. Характеристика valзмінних

  1. Потрібно ініціалізувати
  2. значення не можна змінювати чи перепризначати введіть тут опис зображення

var є як загальна змінна

  1. Пізніше ми можемо ініціалізуватися за допомогою lateinitмодифікатора

    [ lateinitтакож використовувати для глобальної змінної, ми не можемо використовувати її для локальної змінної]

  2. значення може бути змінено або перепризначено, але не в глобальному масштабі

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

valin kotlin- це як finalключове слово у java


12

Просто var (mutable) і val (незмінні значення, як у Java (остаточний модифікатор))

var x:Int=3
x *= x

//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y



11
+----------------+-----------------------------+---------------------------+
|                |             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;               |
+----------------+-----------------------------+---------------------------+

Довідково


8

Ви можете легко мислити це як:

var використовується для сеттера (значення зміниться).

val використовується для Getter (лише для читання, значення не зміниться).


8

Якщо ми оголосимо змінну за допомогою, 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 і var у функції та класи або в первинному конструкторі мають різний зміст?

8

В основному

  • var= змінна , тому вона може змінюватися
  • val= значення , тому воно не може змінитися.

8

У Kotlin 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

Сподіваюсь, це допомагає.


4

Властивість val схожа на кінцеву властивість на Java. Вам дозволяється призначати йому значення лише один раз. Якщо ви спробуєте перепризначити його зі значенням вдруге, ви отримаєте помилку компіляції. Враховуючи те, що властивість var може змінюватися, ви можете перепризначити його за бажанням і в будь-який час.


4

Вам потрібно змінити змінну або встановити її назавжди?

  • Хороший приклад, якщо це щось на зразок val pi5places = 3.14159, ви б встановили це як val. Чи є можливість, що вам потрібно змінити цю змінну зараз або пізніше, ви б встановили її як var.

  • Наприклад: Колір автомобіля, може бути var colorCar = green. Пізніше ви можете змінити те colorCar = blue, де, як val, не можна.

  • Відповіді тут щодо mutableі immutableчудові, але можуть бути страшними, якщо ці терміни недостатньо відомі або просто вивчаються програми.


3

Значення 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")


2

valподібно до constantзмінної, сама по собі не може бути змінена, вона може бути прочитана, але властивості a valможуть бути змінені; varтак само, як мутантна змінна в інших мовах програмування.


2

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 = змінна кінцева

var = змінна перепризначна або протилежна val.


Питання полягає в різниці між двома, а не як розмежувати бота. Будь ласка , перейдіть по посиланню нижче , яка допоможе вам розмістити хороші відповіді stackoverflow.com/help/how-to-answer
Prasoon Karunan V

Тож ви віддаєте перевагу одну і ту ж відповідь, хоча багато людей відповіли на це. А для деяких нових для Котліна людей вал та вар звучать однаково. Тож вам потрібно навести їм приклад того, як їх диференціювати та які вони. Але так, я прийму вашу пораду. Дякую.
Wahyu Anggara Raya

1

Обидва, val й і varїх можна використовувати для декларування змінних (локальні та класові властивості).

Локальні змінні :

  1. valоголошує змінні лише для читання, які можна призначити лише один раз, але їх не можна перепризначити .

Приклад:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. varоголошує перепризначуваних змінні , як ви знаєте , їх Java (ключове слово буде введено в Java 10, «локальний висновок типу змінної» ).

Приклад:

var reasignableString = “hello”
reasignableString = “c u” // OK

Завжди бажано використовувати val. Намагайтеся уникати varякомога частіше!

Властивості класу :

Обидва ключові слова також використовуються для визначення властивостей всередині класів . Як приклад, подивіться на наступне data class:

data class Person (val name: String, var age: Int)

PersonМістить два поля, один з яких призначений тільки для читання ( name). З ageіншого боку, можна перепризначити після інстанціювання класу через надане setter. Зауважте, що nameне буде відповідного методу встановлення.


1

Обидві змінні використовуються як ініціалізація

  • val, як константа змінної, може бути читабельним, а властивості val можна змінювати.

  • var так само, як і змінна змінна. ви можете змінити значення в будь-який час.


1

Коротше кажучи, змінна 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


1

Нормальний

  • Valвикористовується для staticполя, як у Java якStatic Keyword

  • Як Staticу Java / Те саме, що в kotlin

  • І Varпозначає Змінне поле в Котліні, що ви можете його змінити.

  • В основному Staticвикористовується, коли ви хочете одразу зберегти значення в статичній пам'яті,

Приклад:

 if you assign

 val a=1
 a=3  You can not change it 
  • Ви не можете змінити, це кінцеве значення і Статичне

    var b=2

    b=4 U може це змінити


1

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


1

У kotlin ми можемо оголосити змінну двох типів: valі var. valне може бути перепризначений, він працює як остаточна змінна.

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

З іншого боку, вар може бути перезначений, він змінений

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

0

Обидва є змінними. Єдина відмінність полягає в тому, що змінна змінна та незмінна змінна, і різниці немає більше. var - змінна змінна, а val - незмінний. Простий мовою var може змінити значення після ініціалізації значення val є постійним, і він не може змінити його значення після ініціалізації значення.


0

val(від значення): незмінна посилання. Змінна, оголошена valсимволом, не може бути перепризначена після її ініціалізації. Він відповідає finalзмінній в Java.

var(зі змінної): змінна посилання. Значення такої змінної можна змінити. Ця декларація відповідає звичайній (не остаточній) змінній Java.


0

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

0

VAR використовується для створення тієї змінної, значення якої з часом змінюватиметься у вашій програмі. Він такий же, як VAR of swift, тоді як VAL використовується для створення тієї змінної, значення якої не зміниться протягом часу у вашій програмі. Це те саме, що LET of swift.


0

val - Immutable (коли ініціалізацію не можна перепризначити)

var - змінна (може змінювати значення)

Приклад

у Котліні - val n = 20 & var n = 20

У Java - заключний int n = 20; & int n = 20;


0

var - змінна змінна і може призначатися кілька разів, а val незмінний змінний і може бути ініціалізований лише один раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.