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.
Tham chiếu chưa được giải quyết: renameTo. Tại sao? –