2017-06-17 18 views

Trả lời

3

Trên thực tế, String variable là có thể thay đổi, nhưng Chuỗi Value là bất di bất dịch.

Tri ân với @ cricket_007

Hãy để tôi mô tả sâu sắc những gì đã xảy ra sau khi bạn khai báo biến.

val string1 = "abcd" 
val string2 = "abcd" 

enter image description here

Như đã trình bày ở trên hình ảnh và Tuyên bố.

-Mạch hình tròn là khu vực lưu trữ đặc biệt trong Bộ nhớ heap.

-Khi một string is created và nếu chuỗi already exists trong hồ bơi, tham chiếu của existing string will be returned, thay vì tạo đối tượng mới và trả về tham chiếu của nó.

-Nếu chuỗi không phải là bất biến, việc thay đổi chuỗi bằng một tham chiếu sẽ dẫn đến giá trị sai cho các tham chiếu khác.

-Làm như trên ví dụ của chúng tôi Giá trị được gán cho Biến số String1 bây giờ chúng tôi có thể sử dụng biến này.

chúng tôi cũng có thể thay đổi giá trị

string1.renameTo("Hi This Is Test") 

So What xảy ra ở phía sau trong bộ nhớ?
-> vâng,
nếu"Hi This Is Test" chuỗi này có sẵn nó sẽ trả về một tham chiếu đến "chuỗi1"
khác nó Tạo không gian mới và đưa ra tài liệu tham khảo Để "chuỗi1 "

Thực ra, đó là Tại sao chuỗi được gọi là bất biến.

Reference - Link

+0

Tham chiếu chưa được giải quyết: renameTo. Tại sao? –

7

tôi không thích cách các tài liệu được viết bằng một trong hai nhưng không có mâu thuẫn trong thực tế. Họ đang sử dụng từ có thể thay đổi theo cách mời tham gia so sánh giữa các biểu tượng đối tượng không hữu ích.

Biến được khai báo bằng từ khóa var có thể gán lại được trong khi một từ được khai báo với từ khóa val thì không.

Chuỗi là loại đối tượng không thay đổi được, khi đã tạo, không thể thay đổi.

Biến có phải là gán lại và đối tượng trỏ đến là không thay đổi là hai thứ khác nhau không.

Dưới đây là một ví dụ:

class Person(var name: String) 

val fred = Person("Fred") 

fred.name = "Barry" // fred is not immutable 

fred = Person("Barry") // ERROR Val cannot be reassigned 

Vì vậy, để sử dụng có thể thay đổi trong cách các tài liệu hướng dẫn thực hiện, chỉ vì một biểu tượng được khai báo một val không làm cho đối tượng nó trỏ tới không thay đổi.

+0

Có, nhưng có thể thay đổi và có thể gán lại giống nhau? – RBK

+0

Đồng ý rằng cả hai đều có thể gán lại. Nhưng nó không có nghĩa là mutable = reassignable. Đó là những gì tôi muốn làm rõ – RBK

+0

@FrankWilson Ví dụ tuyệt vời! – kirtan403

3

Có gì mâu thuẫn? Một chuỗi là chỉ đọc. Cũng giống như Java, bạn không thể đặt a[i] = 'x', bất kỳ phương thức thay thế chuỗi nào trả về chuỗi mới, v.v. Vì vậy, không thể thay đổi được. Điểm này được thực hiện để làm rõ chức năng của var Loại chuỗi

Sự khác biệt giữa var và val có thể được liên kết với biến số final trong Java. Bạn có thể tạo một hằng số final String hoặc bạn có thể có đối tượng String thông thường

+0

Đồng ý rằng val và var là liên quan đến cuối cùng của java ... Nhưng là một chuỗi khai báo với var mutable hoặc không thay đổi? – RBK

+2

Nó luôn luôn bất biến, như tôi đã giải thích và tài liệu nói ... Chính xác bạn mong đợi làm gì nếu một chuỗi có thể thay đổi được? –

4

An excellent example bởi @Frank. Nó làm cho tôi rõ ràng hơn, những gì tài liệu nói.

Phần đầu của tài liệu nói:

Lớp học trong Kotlin có thể có các thuộc tính. Đây có thể được khai báo là có thể thay đổi, sử dụng từ khóa var hoặc chỉ đọc bằng cách sử dụng từ khóa val.

Bây giờ, phần thứ hai nói:

Strings được đại diện bởi các kiểu String.Chuỗi không thay đổi.

Cả hai đều đúng theo ý kiến ​​của tôi.

Dựa trên ví dụ của Frank, hãy lấy một ví dụ khác.

data class User(var name: String, var email:String) 

var user1 = User("Foo","[email protected]") 
// user1 is mutable and object properties as well 

val user2 = User("Bar","[email protected]") 
// user2 is immutable but object's properties are mutable 

Bây giờ, hãy xem xét tài sản user1. Nó có thể thay đổi khi được khai báo với từ khóa var. Và cũng là đối tượng User gán cho nó.

Nhưng thuộc tính user2 là không thay đổi. Bạn không thể thay đổi đối tượng được gán cho nó. Nhưng bản thân Object cũng có các đặc tính có thể thay đổi được. Vì vậy, các thuộc tính có thể thay đổi theo user2.name = "Foo".

Bây giờ thay đổi ví dụ một chút và làm cho thuộc tính người dùng không thay đổi.

data class User(val name: String, val email:String) 

var user1 = User("Foo","[email protected]") 
// user1 is mutable and object properties are not 

val user2 = User("Bar","[email protected]") 
// user2 is immutable and object's properties are also immutable 

Ở đây, thuộc tính của người dùng không thay đổi. Vì vậy, user1 có thể thay đổi, bạn có thể gán một đối tượng khác cho nó. Nhưng các đặc tính là bất biến. Vì vậy, user1 = User("New Foo","[email protected]") sẽ hoạt động. Nhưng sau khi gán một đối tượng User, bạn không thể thay đổi thuộc tính của nó, vì chúng không thay đổi.

Bây giờ, hãy lấy một ví dụ với loại Chuỗi.

var str1 = "Bar" 
// Here str1 (property) is mutable. So you can assign a different string to it. 
// But you can not modify the String object directly. 
str1 = "Foo" // This will work 
str1[0] = 'B' // This will NOT work as The string object assigned to str1 is immutable 

val str2 = "Foo" 
// Here both str2 and the assigned object are immutable. (Just like Java final) 

Và như Frank nói,

chỉ vì một biểu tượng được khai báo một val không làm cho đối tượng mà nó trỏ tới không thay đổi.

xu cuối cùng của tôi:

đối tượng String là không thay đổi, vì nó không thể thay đổi. Nhưng đối tượng String không thay đổi này có thể được gán cho thuộc tính có thể thay đổi , trong đó có thể được gán lại với đối tượng chuỗi khác nhau. Đó là những gì var từ khóa. Làm cho thuộc tính có thể thay đổi. Nhưng đối tượng nó điểm để có thể thay đổi hoặc không thay đổi được.

0

Trong Kotlin/Java, hành vi của đối tượng là không phụ thuộc vào loại tham chiếu bạn sử dụng để truy cập. Tất cả mọi thứ là (có khả năng) trong đống, vì vậy bất kỳ tài sản chỉ là một tham chiếu (liên kết a.k.a.) cho đối tượng.

val str = "Hello" 
val a = str 
var b = str 

Trong đoạn trên chỉ có một bất biến chuỗi str, và cả hai ab tham khảo nó. Bạn không thể thay đổi chuỗi, bất kể tham chiếu nào bạn sử dụng, có thể thay đổi hoặc không thay đổi được.Nhưng bạn có thể thay đổi các tài liệu tham khảo có thể thay đổi bản thân để trỏ đến một (không thay đổi) chuỗi:

b = "World" 
0

Cá nhân, tôi tìm thấy nó dễ dàng hơn để nghĩ về sự khác biệt giữa valvar về Java. val sẽ tương ứng với một biến với công cụ sửa đổi final, có nghĩa là chỉ có thể được chỉ định một lần và var chỉ với thay đổi đó vắng mặt và do đó có thể gán lại.

Bản thân đối tượng vẫn có thể là có thể thay đổi hoặc không thay đổi được. Tính đột biến ở đây đề cập đến biến đó.

Các vấn đề liên quan