Val i Var w Kotlin

289

Jaka jest różnica między vari valw Kotlin?

Przejrzałem ten link:

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

Zgodnie z tym linkiem:

Pełna składnia deklaracji właściwości tylko do odczytu różni się od zmiennej na dwa sposoby: zaczyna się od val zamiast var i nie pozwala na ustawienie.

Ale tuż przed przykładem jest 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
}

Jaka jest dokładna różnica między vari val?

Dlaczego potrzebujemy obu?

Jest to nie duplikat od zmiennych w Kotlin, różnic z Java. var vs val? ponieważ pytam o wątpliwości związane z konkretnym przykładem w dokumentacji, a nie tylko ogólnie.

Akshar Patel
źródło
4
resultnie można go zmienić, aby odwoływał się do innego wystąpienia Address, ale wystąpienie, którego dotyczy, może być nadal modyfikowane. To samo byłoby prawdą w Javie, gdybyś miałfinal Address result = new Address();
Michaela
skieruj
Anam Ansari
Przybyłem tutaj, aby uzyskać odpowiedź, ponieważ strona internetowa Kotlin, która po raz pierwszy opisuje zmienne, była zbyt głupia, aby o tym wspomnieć: kotlinlang.org/docs/reference/basic-syntax.html
AndroidDev

Odpowiedzi:

239

W kodzie resultsię nie zmienia, zmieniają się jego varwłaściwości. Zobacz komentarze poniżej:

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
}

valjest taki sam jak finalmodyfikator w Javie. Jak zapewne powinieneś wiedzieć, że nie możemy finalponownie przypisać zmiennej, ale możemy zmienić jej właściwości.

chandil03
źródło
1
val i var w funkcji i klasach lub w głównym konstruktorze mają inne znaczenie?
3
@ Nic Nie, wszędzie to samo.
chandil03
Ale kiedy deklaruję zmienną z var w klasie, wymagała ona inicjalizacji, ponieważ deklaruje właściwość. Ale w funkcji nie wymagało inicjalizacji dlaczego?
Ponieważ gdy klasa ładuje się do pamięci, jej właściwości również są oceniane. Ale w zmiennych funkcyjnych są oceniane, gdy wykonywany jest kod funkcji.
chandil03
Jego średnia w funkcji lub w klasie zarówno słowo kluczowe vali varsą używane do deklarowania właściwości? nie zmienny?
142

vali varoba służą do deklarowania zmiennej.

var jest jak zmienna ogólna i jest znana jako zmienna zmienna w kotlin i może być przypisywana wiele razy.

val jest jak zmienna końcowa i jest znany jako niezmienny w kotlin i może być zainicjowany tylko raz.

Aby uzyskać więcej informacji, co znajduje się vali varzobacz poniższy link

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

Patel Pinkal
źródło
23

zmienne zdefiniowane za pomocą var są zmienne (odczyt i zapis)

zmienne zdefiniowane za pomocą val są niezmienne (tylko do odczytu)

Kotlin może usunąć findViewById i zmniejszyć kod dla setOnClickListener w Android Studio. Pełny opis : niesamowite funkcje Kotlin

wartość zmiennych zmiennych można zmienić w dowolnym momencie, natomiast nie można zmienić wartości zmiennych niezmiennych.

gdzie powinienem używać var ​​i gdzie val?

użyj var, gdzie wartość często się zmienia. Na przykład podczas uzyskiwania lokalizacji urządzenia z systemem Android

var integerVariable : Int? = null

użyj val, gdy nie ma zmiany wartości w całej klasie. Na przykład chcesz programowo ustawić widok tekstu lub tekst przycisku.

val stringVariables : String = "Button's Constant or final Text"
użytkownik6435056
źródło
17
„Kotlin może usunąć findViewById i zredukować kod dla setOnClickListener w Android Studio. Pełne odniesienie: niesamowite funkcje Kotlin” Jak to się ma do pytania?
denvercoder9
4
zmienne val niekoniecznie są niezmienne. Są ostateczne - tylko odwołanie jest niezmienne - ale jeśli obiekt przechowywany w val jest modyfikowalny, obiekt jest mutable bez względu na to, czy jest on przypisany przez val, czy var.
Travis,
nie widzę sensu wprowadzania dwóch nowych słów kluczowych, chociaż można to zrobić znacznie lepiej, co zrozumiałe wcześniej w Javie
ruben
18

valsłuży do deklarowania zmiennej końcowej. Charakterystyka valzmiennych

  1. Musi zostać zainicjowany
  2. wartości nie można zmienić ani zmienić przypisania wprowadź opis zdjęcia tutaj

var jest jako zmienna ogólna

  1. Możemy zainicjować później za pomocą lateinitmodyfikatora

    [ lateinitużyj także dla zmiennej globalnej, nie możemy użyć jej dla zmiennej lokalnej]

  2. wartość można zmienić lub zmienić przypisanie, ale nie w zakresie globalnym

wprowadź opis zdjęcia tutaj

valin kotlinjest jak finalsłowo kluczowe w java


źródło
12

Po prostu var (mutable) i val (niezmienne wartości jak w Javie (modyfikator końcowy))

var x:Int=3
x *= x

//gives compilation error (val cannot be re-assigned)
val y: Int = 6
y*=y
huseyin
źródło
12

val jest immutablei var jest mutablew Kotlin.

Samir Mangroliya
źródło
12

Po prostu pomyśl Val jak ostatnia zmienna w java

Łączenie życia z Androidem
źródło
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;               |
+----------------+-----------------------------+---------------------------+

Odniesienie

Joby Wilson Mathews
źródło
8

Możesz łatwo pomyśleć to jako:

var służy do ustawienia (wartość ulegnie zmianie).

val służy do pobierania (tylko do odczytu, wartość się nie zmieni).

Ling Boo
źródło
8

Jeśli zadeklarujemy zmienną za pomocą val, będzie to zmienna tylko do odczytu . Nie możemy zmienić jego wartości. To jest jak ostatnia zmienna Java . Jest immutable.

Ale jeśli zadeklarujemy zmienną za pomocą var, będzie to zmienna, którą możemy odczytać lub zapisać . Możemy zmienić jego wartość. Jest 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
}

valnie może być ostatnio zainicjowany przez słowo kluczowe, lateinitale nieprymitywne varmoże być ostatnio zainicjowane przez słowo kluczowe lateinit.

Avijit Karmakar
źródło
val i var w funkcji i klasach lub w głównym konstruktorze mają inne znaczenie?
8

Gruntownie

  • var= zmienna , więc może się zmienić
  • val= wartość , więc nie można jej zmienić.
Bharat Sonawane
źródło
8

W Kotlinie valjest właściwość tylko do odczytu i może być dostępna tylko dla gettera. valjest niezmienny.

val przykład:

val piNumber: Double = 3.1415926
    get() = field

Jest to jednak właściwość vardo odczytu i zapisu , więc dostęp do niej może uzyskać nie tylko getter, ale i setter. varjest zmienny.

var przykład:

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

Jeśli spróbujesz zmienić niezmienny val, IDE wyświetli błąd:

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

// RESULT:   Val cannot be reassigned 

Ale zmienne varmożna zmienić:

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

// RESULT:   0.0

Mam nadzieję że to pomoże.

Andy
źródło
4

Właściwość val jest podobna do właściwości końcowej w Javie. Możesz przypisać mu wartość tylko raz. Podczas drugiej próby przypisania wartości wartością pojawi się błąd kompilacji. Podczas gdy własność var ​​jest zmienna, którą możesz dowolnie przypisać, kiedy chcesz i na dowolny czas.

Halil RAŞO
źródło
4

Czy musisz zmienić zmienną lub ustawić ją na stałe?

  • Dobry przykład, jeśli jest to coś w rodzaju val pi5places = 3.14159 , ustawiłbyś to jako val. Czy istnieje możliwość, że musisz zmienić tę zmienną teraz lub później, a następnie ustaw ją jako var.

  • Na przykład: Kolor samochodu może być var colorCar = green. Później możesz to zmienić colorCar = blue, gdy valnie możesz tego zrobić.

  • Odpowiedzi tutaj dotyczące mutablei immutablesą w porządku, ale mogą być przerażające, jeśli te terminy nie są dobrze znane lub po prostu zaczynają się uczyć programowania.

teckeon
źródło
3

Wartość do valzmiennej można przypisać tylko raz.

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

Chociaż nie można ponownie przypisać wartości, ale z pewnością można zmodyfikować właściwości obiektu.

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

Oznacza to, że nie można zmienić odwołania do obiektu, na który wskazuje zmienna, ale można zmienić podstawowe właściwości tej zmiennej.

Wartość zmiennej var można przypisać dowolną liczbę razy.

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

Oczywiście właściwości leżące u jego podstaw można zmieniać, o ile nie zostaną zadeklarowane jako val.

//Given that city and country are not val
address.setCity("Delhi")
address.setCountry("India")
Saurabh Padwekar
źródło
3

Dwa sposoby tworzenia zmiennej w KOTLIN VAL i VAR

1. VAL przechowuje wartości stałe. Nazywany także zmienną końcową

2. VAR przechowuje zmienne wartości

Kliknij tutaj na przykład

Coltin Casmir
źródło
2

valpodobnie jak constantzmienna, sama nie może zostać zmieniona, można ją tylko odczytać, ale właściwości a valmożna modyfikować; varpodobnie jak zmienna mutanta w innych językach programowania.

suyanlu
źródło
2

val jest niezmienny, końcowy, pierwszej przypisanej wartości nie można zmienić.

val name:String = "andy"

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

var jest zmienny, można go ponownie przypisać, możesz zmieniać wartość w kółko.

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

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

Myślę, że najłatwiej to zapamiętać:

val = zmienna końcowa

var = zmienna, którą można ponownie przypisać, lub odwrotnie niż val.

Wahyu Anggara Raya
źródło
Pytanie dotyczy różnicy między dwoma, a nie jak odróżnić bota. Proszę przejść przez poniższy link, który pomoże Ci opublikować dobre odpowiedzi stackoverflow.com/help/how-to-answer
Prasoon Karunan V
Więc wolisz tę samą odpowiedź, mimo że wiele osób na nią odpowiada. A dla niektórych osób początkujących w Kotlin, val i var brzmią tak samo. Musisz więc dać im przykład, jak to odróżnić i jakie są. Ale tak, posłucham twojej rady. Dzięki.
Wahyu Anggara Raya
1

Zarówno vali varmogą być używane do deklarowania zmiennych (właściwości lokalne i właściwości klasy).

Zmienne lokalne :

  1. valdeklaruje zmienne tylko do odczytu, które można przypisać tylko raz, ale nie można ich ponownie przypisać .

Przykład:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. vardeklaruje zmienne, które można ponownie przypisać z języka Java (słowo kluczowe zostanie wprowadzone w Javie 10, „wnioskowanie typu zmiennej lokalnej” ).

Przykład:

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

Zawsze lepiej jest używać val . Staraj się unikać vartak często, jak to możliwe!

Właściwości klasy :

Oba słowa kluczowe są również używane do definiowania właściwości wewnątrz klas . Jako przykład, spójrz na następujące data class:

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

PersonZawiera dwa pola, z których jeden jest tylko do odczytu ( name). Z agedrugiej strony, można ponownie przypisać po utworzeniu instancji klasy, za pośrednictwem podanego setter. Zauważ, że namenie będzie mieć odpowiedniej metody ustawiania.

s1m0nw1
źródło
1

Obie zmienne są używane jako inicjalizacja

  • val jak stała zmienna, może być czytelny, a właściwości val można modyfikować.

  • var podobnie jak zmienna zmienna. możesz zmienić wartość w dowolnym momencie.

Nikhil Katekhaye
źródło
1

Krótko mówiąc, zmienna val jest wartością końcową (niemodyfikowalną) lub stałą wartością, która nie będzie zmieniana w przyszłości, a zmienną var (zmienną) można zmienić w przyszłości.

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

Zobacz powyższy kod. Jest to klasa modelowa, która będzie używana do przekazywania danych. Mam ustawiony val przed zmienną, ponieważ zmienna ta została wykorzystana w celu uzyskania danych.

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

Ponadto, jeśli chcesz ustawić dane później, musisz użyć słowa kluczowego var przed zmienną, jeśli potrzebujesz tylko raz uzyskać wartość, użyj słowa kluczowego val

Shaon
źródło
1

Normalna

  • Valużywa dla staticpola jak w Javie jakoStatic Keyword

  • Jak Staticw Javie / Taki sam jak w kotlin

  • I Varoznacza zmienne pole w Kotlinie, że możesz to zmienić.

  • Najczęściej Staticjest używany, gdy chcesz jednocześnie zapisać wartość w pamięci statycznej,

Przykład:

 if you assign

 val a=1
 a=3  You can not change it 
  • Nie można zmienić, jest to wartość końcowa i statyczna

    var b=2

    b=4 Możesz to zmienić

ZafarHussain
źródło
1

val: należy dodać lub zainicjować wartość, ale nie można jej zmienić. var: zmienna może zmieniać się w dowolnym wierszu kodu.

Mohamed Ibrahim
źródło
1

W kotlin możemy zadeklarować zmienną w dwóch typach: vali var. valnie można go ponownie przypisać, działa jako zmienna końcowa.

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

Z drugiej strony var może zostać ponownie przypisany, jest zmienny

var x = 2
x=3 // can be reassigned
Marium Jawed
źródło
0

Oba są zmienne, jedyną różnicą jest zmienna zmienna i zmienna niezmienna i nie ma już żadnej różnicy. var jest zmienną zmienną, a val jest niezmienny. W prostym języku var może zmieniać wartość po inicjalizacji wartość val jest stała i nie może jej zmienić po inicjalizacji wartości.

Nacięcie
źródło
0

val(od wartości): Niezmienne odniesienie. Zmiennej zadeklarowanej za valpomocą nie można ponownie przypisać po jej zainicjowaniu. Odpowiada tofinal zmiennej w Javie.

var(ze zmiennej): Zmienne odniesienie. Wartość takiej zmiennej można zmienić. Ta deklaracja odpowiada zwykłej (nie ostatecznej) zmiennej Java.

Gulzar Bhat
źródło
0

Var oznacza Zmienną - Jeśli zapisałeś dowolny obiekt za pomocą „var” , może on ulec zmianie w czasie.

Na przykład:

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

Val oznacza wartość - To jest jak „stała” w java. Jeśli zapisałeś dowolny obiekt używając „val”, to nie mógł się zmienić w czasie.

Na przykład:

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)
}
NHB SOHEL
źródło
0

VAR służy do tworzenia tych zmiennych, których wartość zmienia się w miarę upływu czasu w twojej aplikacji. Jest to to samo, co VAR dla swift, natomiast VAL służy do tworzenia tych zmiennych, których wartość nie zmieni się z upływem czasu w twojej aplikacji. Jest to to samo, co LET dla swift.

Ashutosh Shukla
źródło
0

val - Niezmienny (po zainicjowaniu nie można go ponownie przypisać)

var - Zmienny (może zmieniać wartość)

Przykład

w Kotlinie - val n = 20 i var n = 20

W Javie - końcowy int n = 20; i int n = 20;

Najib Ahmed Puthawala
źródło
0

var jest zmienną zmienną i może być przypisywana wiele razy, a val jest zmienną niezmienną i może być zainicjalizowany tylko raz.

Yohan Malshika
źródło