Val và Var trong Kotlin


288

Sự khác biệt giữa varvaltrong Kotlin là gì?

Tôi đã đi qua liên kết này:

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

Như đã nêu trên liên kết này:

Cú pháp đầy đủ của một khai báo thuộc tính chỉ đọc khác với một biến đổi theo hai cách: nó bắt đầu bằng val thay vì var và không cho phép một setter.

Nhưng ngay trước khi có một ví dụ sử dụng 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
}

Sự khác biệt chính xác giữa varvà là valgì?

Tại sao chúng ta cần cả hai?

Đây không phải là một bản sao của Biến trong Kotlin, khác biệt với Java. var vs val? như tôi đang hỏi về sự nghi ngờ liên quan đến ví dụ cụ thể trong tài liệu và không chỉ nói chung.


4
resultkhông thể thay đổi để chỉ một thể hiện khác Address, nhưng thể hiện mà nó đề cập đến vẫn có thể được sửa đổi. Điều tương tự cũng sẽ đúng trong Java nếu bạn có mộtfinal Address result = new Address();
Michael


Đến đây để tìm câu trả lời vì trang web của Kotlin lần đầu tiên mô tả các biến quá ngu ngốc khi đề cập đến nó ở đó: kotlinlang.org/docs/reference/basic-syntax.html
AndroidDev 14/11/18

Câu trả lời:


239

Trong mã của bạn resultkhông thay đổi, varthuộc tính của nó đang thay đổi. Tham khảo ý kiến ​​dưới đây:

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
}

valgiống như công cụ finalsửa đổi trong java. Như bạn có thể nên biết rằng chúng ta không thể gán lại cho một finalbiến nhưng có thể thay đổi các thuộc tính của nó.


1
val và var trong hàm và các lớp hoặc trong hàm tạo chính có ý nghĩa khác nhau?

3
@Noth Không, mọi nơi đều giống nhau.
chandil03

Nhưng khi tôi khai báo biến với var trong lớp thì nó yêu cầu khởi tạo vì nó khai báo thuộc tính. Nhưng trong chức năng nó không yêu cầu khởi tạo tại sao?

Bởi vì khi lớp tải vào bộ nhớ, các thuộc tính của nó cũng được đánh giá. Nhưng trong các biến chức năng được đánh giá khi mã chức năng được thực thi.
chandil03

Nghĩa của nó bên trong hàm hoặc bên trong lớp cả từ khóa valvarđược sử dụng để khai báo các thuộc tính? không biến?

142

valvarcả hai đều được sử dụng để khai báo một biến.

var giống như biến chung và nó được gọi là biến có thể thay đổi trong kotlin và có thể được gán nhiều lần.

val giống như biến cuối cùng và nó được gọi là bất biến trong kotlin và chỉ có thể được khởi tạo một lần duy nhất.

Để biết thêm thông tin là gì valvarvui lòng xem liên kết dưới đây

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


23

các biến được định nghĩa với var là có thể thay đổi (Đọc và Viết)

các biến được định nghĩa bằng val là bất biến (Chỉ đọc)

Kotlin có thể xóa findViewById và giảm mã cho setOnClickListener trong studio android. Để tham khảo đầy đủ: Các tính năng tuyệt vời của Kotlin

giá trị của các biến có thể thay đổi có thể được thay đổi bất cứ lúc nào, trong khi bạn không thể thay đổi giá trị của các biến không thay đổi.

Tôi nên sử dụng var và val ở đâu?

sử dụng var trong đó giá trị thay đổi thường xuyên. Ví dụ: trong khi nhận vị trí của thiết bị Android

var integerVariable : Int? = null

sử dụng val khi không có thay đổi về giá trị trong cả lớp. Ví dụ: bạn muốn đặt textview hoặc nút văn bản theo chương trình.

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

17
"Kotlin có thể xóa findViewById và giảm mã cho setOnClickListener trong studio android. Để tham khảo đầy đủ: Các tính năng tuyệt vời của Kotlin" Điều này có liên quan đến câu hỏi như thế nào?
denvercoder9

4
biến val không nhất thiết là bất biến. Chúng là cuối cùng - chỉ tham chiếu là bất biến - nhưng nếu đối tượng được lưu trữ trong val là có thể thay đổi, thì đối tượng có thể thay đổi bất kể nó được gán qua val hay var.
Travis

Tôi không thấy điểm giới thiệu hai từ khóa mới trong khi nó có thể được thực hiện tốt hơn nhiều trước đây trong Java
ruben

18

valsử dụng để khai báo biến cuối cùng. Đặc điểm củaval biến

  1. Phải được khởi tạo
  2. giá trị không thể thay đổi hoặc gán lại nhập mô tả hình ảnh ở đây

var là một biến chung

  1. Chúng ta có thể khởi tạo sau bằng cách sử dụng lateinit sửa đổi

    [lateinit cũng sử dụng cho biến toàn cục, chúng tôi không thể sử dụng nó cho biến cục bộ]

  2. giá trị có thể được thay đổi hoặc gán lại nhưng không thuộc phạm vi toàn cầu

nhập mô tả hình ảnh ở đây

valtrong kotlingiống như finaltừ khóa trong java


12

Đơn giản, var (có thể thay đổi) và val (giá trị không thay đổi như trong Java (công cụ sửa đổi cuối cùng))

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

Tài liệu tham khảo


8

Bạn có thể dễ dàng nghĩ nó như:

var được sử dụng cho setter (giá trị sẽ thay đổi).

val được sử dụng cho getter (chỉ đọc, giá trị sẽ không thay đổi).


8

Nếu chúng ta khai báo biến bằng cách sử dụng valthì đó sẽ là biến chỉ đọc . Chúng tôi không thể thay đổi giá trị của nó. Nó giống như biến cuối cùng của Java . Đó là immutable.

Nhưng nếu chúng ta khai báo biến bằng cách sử dụng varthì đó sẽ là một biến mà chúng ta có thể đọc hoặc viết . Chúng ta có thể thay đổi giá trị của nó. Đó là 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
}

valkhông thể được khởi tạo gần đây bởi từ khóa lateinitnhưng không nguyên thủy varcó thể được khởi tạo gần đây bởi từ khóa lateinit.


val và var trong hàm và các lớp hoặc trong hàm tạo chính có ý nghĩa khác nhau?

8

Về cơ bản

  • var= biến , vì vậy nó có thể thay đổi
  • val= giá trị , vì vậy nó không thể thay đổi.

8

Trong Kotlin vallà một thuộc tính chỉ đọc và nó chỉ có thể được truy cập bởi một getter. vallà bất biến.

val thí dụ :

val piNumber: Double = 3.1415926
    get() = field

Tuy nhiên, varlà một thuộc tính đọc và ghi , vì vậy nó có thể được truy cập không chỉ bởi một getter mà còn là một setter. varlà đột biến.

var thí dụ :

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

Nếu bạn cố gắng thay đổi một bất biến val, IDE sẽ hiển thị cho bạn lỗi:

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

// RESULT:   Val cannot be reassigned 

Nhưng một đột biến varcó thể được thay đổi:

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

// RESULT:   0.0

Hi vọng điêu nay co ich.


4

tài sản val tương tự như tài sản cuối cùng trong Java. Bạn được phép gán cho nó một giá trị chỉ trong một lần. Khi bạn cố gắng gán lại nó với một giá trị cho lần thứ hai, bạn sẽ gặp lỗi biên dịch. Trong khi đó tài sản var có thể thay đổi mà bạn có thể tự do gán lại nó khi bạn muốn và cho bất kỳ lúc nào bạn muốn.


4

Bạn có cần thay đổi một biến hoặc đặt nó vĩnh viễn?

  • Một ví dụ điển hình nếu nó là một cái gì đó như val pi5places = 3.14159 bạn sẽ đặt nó là val. Có khả năng bạn cần thay đổi biến đó ngay bây giờ hay sau đó, sau đó bạn sẽ đặt nó là var.

  • Ví dụ: Màu sắc của một chiếc xe hơi, có thể var colorCar = green. Sau này bạn có thể thay đổi điều đó colorCar = blue, khi mà val, bạn không thể.

  • Phản hồi ở đây liên quan mutableimmutabletốt, nhưng có thể đáng sợ nếu những điều khoản này không được biết đến nhiều hoặc chỉ học cách lập trình.


3

Giá trị cho valbiến chỉ có thể được chỉ định một lần.

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

Mặc dù bạn không thể gán lại giá trị nhưng bạn chắc chắn có thể sửa đổi các thuộc tính của đối tượng.

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

Điều đó có nghĩa là bạn không thể thay đổi tham chiếu đối tượng mà biến đang trỏ tới nhưng các thuộc tính cơ bản của biến đó có thể được thay đổi.

Giá trị cho biến var có thể được gán lại nhiều lần như bạn muốn.

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

Rõ ràng, các thuộc tính cơ bản của nó có thể được thay đổi miễn là chúng không được khai báo val.

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


2

valgiống như constantbiến, bản thân nó không thể thay đổi, chỉ có thể được đọc, nhưng các thuộc tính của a valcó thể được sửa đổi; vargiống như biến đột biến trong các ngôn ngữ lập trình khác.


2

val là bất biến, cuối cùng, giá trị được gán đầu tiên không thể thay đổi.

val name:String = "andy"

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

var có thể thay đổi, có thể gán lại, bạn có thể thay đổi giá trị nhiều lần.

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

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

Tôi nghĩ cách dễ nhất để nhớ nó:

val = biến cuối cùng

var = biến có thể gán lại, hoặc ngược lại với val.


Câu hỏi là về sự khác biệt giữa hai, không phải làm thế nào để phân biệt bot. Vui lòng đi qua liên kết dưới đây sẽ giúp bạn đăng câu trả lời tốt stackoverflow.com/help/how-to-answer
Prasoon Karunan V

Vì vậy, bạn thích câu trả lời tương tự, mặc dù rất nhiều người đã trả lời điều đó. Và đối với một số người mới sử dụng Kotlin, val và var có vẻ giống nhau. Vì vậy, bạn cần cho họ một ví dụ về cách phân biệt nó và chúng là gì. Nhưng vâng, tôi sẽ lấy lời khuyên của bạn. Cảm ơn.
Wahyu Anggara Raya

1

Cả hai valvarcó thể được sử dụng để khai báo các biến (thuộc tính cục bộ và lớp).

Biến cục bộ :

  1. valkhai báo các biến chỉ đọc chỉ có thể được gán một lần, nhưng không thể được chỉ định lại .

Thí dụ:

val readonlyString = “hello”
readonlyString = “c u” // Not allowed for `val`
  1. varkhai báo các biến có thể gán lại khi bạn biết chúng từ Java (từ khóa sẽ được giới thiệu trong Java 10, loại biến cục bộ kiểu suy luận ra ).

Thí dụ:

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

Nó luôn luôn là tốt hơn để sử dụng val. Cố gắng tránh varcàng thường xuyên càng tốt!

Thuộc tính lớp :

Cả hai từ khóa cũng được sử dụng để xác định các thuộc tính bên trong các lớp . Ví dụ, hãy xem những điều sau đây data class:

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

Các trường Personchứa hai trường, một trong số đó là readonly ( name). Mặt agekhác, có thể được chỉ định lại sau khi khởi tạo lớp, thông qua việc cung cấp setter. Lưu ý rằng namesẽ không có phương thức setter tương ứng.


1

Cả hai biến được sử dụng làm khởi tạo

  • val giống như một biến không đổi, Nó có thể đọc được và các thuộc tính của val có thể được sửa đổi.

  • var giống như một biến có thể thay đổi. bạn có thể thay đổi giá trị bất cứ lúc nào.


1

Nói tóm lại, biến val là cuối cùng (không thể thay đổi) hoặc giá trị không đổi sẽ không bị thay đổi trong tương lai và biến var (có thể thay đổi) có thể được thay đổi trong tương lai.

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

Xem mã trên. Nó là một lớp mô hình, sẽ được sử dụng để truyền dữ liệu. Tôi đã đặt val trước biến vì biến này được sử dụng để lấy dữ liệu.

class DeliveryOrderEvent(var d : Delivery)

// setter and getter is fine here. No error

Ngoài ra, nếu bạn cần thiết lập dữ liệu sau này, bạn cần sử dụng từ khóa var trước một biến, nếu bạn chỉ cần lấy giá trị một lần thì hãy sử dụng từ khóa val


1

Bình thường

  • Valđang sử dụng cho statictrường như trong Java nhưStatic Keyword

  • Giống như Statictrong Java / Tương tự như trong kotlin

  • Varbiểu thị Trường biến trong Kotlin rằng, bạn có thể thay đổi nó.

  • Chủ yếu Staticđược sử dụng khi bạn muốn lưu giá trị trong bộ nhớ tĩnh cùng một lúc,

Thí dụ:

 if you assign

 val a=1
 a=3  You can not change it 
  • Bạn không thể thay đổi, đây là giá trị cuối cùng và Tĩnh

    var b=2

    b=4 Bạn có thể thay đổi nó


1

val: phải thêm hoặc khởi tạo giá trị nhưng không thể thay đổi. var: biến của nó có thể thay đổi ba dòng trong bất kỳ dòng nào trong mã.


1

Trong kotlin chúng ta có thể khai báo biến theo hai loại: valvar. valkhông thể được chỉ định lại, nó hoạt động như một biến cuối cùng.

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

Mặt khác, var có thể được chỉ định lại là có thể thay đổi

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

0

Cả hai đều là biến khác nhau duy nhất là biến Mutable và biến bất biến và không có gì khác biệt hơn. var là biến Mutable và val là bất biến. Trong ngôn ngữ đơn giản var có thể thay đổi là giá trị sau khi giá trị khởi tạo val không đổi và nó không thể thay đổi giá trị sau khi khởi tạo giá trị.


0

val(từ giá trị): Tham chiếu bất biến. Một biến được khai báo valkhông thể được chỉ định lại sau khi nó được khởi tạo. Nó tương ứng với một finalbiến trong Java.

var(từ biến): Tham chiếu có thể thay đổi. Giá trị của một biến như vậy có thể được thay đổi. Tuyên bố này tương ứng với một biến Java thông thường (không phải là cuối cùng).


0

Var có nghĩa là Biến -Nếu bạn lưu trữ bất kỳ đối tượng nào bằng cách sử dụng 'var' nó có thể thay đổi theo thời gian.

Ví dụ:

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

Val có nghĩa là giá trị - Nó giống như một 'hằng số' trong java. Nếu bạn lưu trữ bất kỳ đối tượng nào bằng cách sử dụng 'val' thì nó không thể thay đổi theo thời gian.

Ví dụ:

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 được sử dụng để tạo các biến có giá trị sẽ thay đổi theo thời gian trong ứng dụng của bạn. Nó giống như VAR của swift, trong khi VAL được sử dụng để tạo các biến có giá trị sẽ không thay đổi theo thời gian trong ứng dụng của bạn. Nó giống như LET of swift.


0

val - Bất biến (một khi đã khởi tạo không thể được chỉ định lại)

var - Mutable (có thể thay đổi giá trị)

Thí dụ

trong Kotlin - val n = 20 & var n = 20

Trong Java - cuối cùng int n = 20; & int n = 20;


0

var là một biến có thể thay đổi và có thể được gán nhiều lần và val là biến không thay đổi và chỉ có thể được xác định trong một lần duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.