2010-11-07 29 views
18

Các lớp Java Wrapper được cho là không thay đổi. Điều này có nghĩa là khi một đối tượng đang được tạo, ví dụ:Các lớp Java wrapper có thực sự bất biến không?

Integer i = new Integer(5); 

giá trị của nó không thể thay đổi. Tuy nhiên, làm

i = 6; 

hoàn toàn hợp lệ.

Vì vậy, tính bất biến trong ngữ cảnh này có ý nghĩa gì? Điều này có liên quan đến tự động boxing/unboxing không? Nếu vậy, có cách nào để ngăn trình biên dịch thực hiện nó không?

Cảm ơn bạn

Trả lời

25

i là tham chiếu. Mã của bạn thay đổi tham chiếu i để trỏ đến một khác nhau, không thay đổi, Integer.

final Integer i = Integer.valueOf(5); 

có thể hữu ích hơn.

18

Không thể thay đổi có nghĩa là trạng thái đối tượng không thể thay đổi. Trong trường hợp của bạn, bạn chưa thay đổi đối tượng new Integer(5), nhưng bạn đã thay đổi tham chiếu i để trỏ đến một đối tượng khác. Hy vọng điều đó rõ ràng :)

5

Lý do i = 6 hoạt động là tự động đấm bốc đang chặn và biến thành i = new Integer(6). Vì vậy, như @ Peter đã nói, bạn đang chỉ vào một đối tượng mới.

+0

Gần như - nó biến nó thành 'Integer.valueOf (6)'. Xem phần này để biết thêm thông tin: http://marxsoftware.blogspot.com/2010/08/subtle-nuance-of-new-keyword-with.html –

+0

Rất tiếc. My Bad :-) Tôi đã không thực sự làm phiền để tìm kiếm chính xác những gì nó dịch sang. – drekka

11

Trình biên dịch autoboxes giá trị nguyên thủy, điều này có nghĩa rằng

Integer value = 6; 

sẽ được biên dịch như

Integer value = Integer.valueOf(6); 

Integer.valueOf sẽ trở lại một thể hiện Integer với giá trị nhất định. Trong trường hợp của bạn i bây giờ sẽ tham chiếu Số nguyên (6) thay vì Số nguyên (5), chính đối tượng Số nguyên (5) sẽ không thay đổi.

Để thấy điều này bạn có thể làm sau

Integer i = new Integer(5);//assign new integer to i 
Integer b = i;//b refences same integer as i 
i = 6;//modify i 
System.out.println(i +"!="+b); 

này sẽ in 6!=5, nếu trường hợp số nguyên đã được sửa đổi nó sẽ in 6!=6 để thay thế.

Để làm rõ điều này chỉ có nghĩa là để chỉ ra cách gán cho Integer chỉ sửa đổi tham chiếu và không thay đổi bản thân Integer. Khi người dùng @KNU chỉ ra nó không chứng minh hoặc cho thấy sự bất biến của Integer, theo như tôi có thể nói sự bất biến chỉ được gián tiếp đưa ra bởi việc thiếu các phương thức sửa đổi trong API của nó và yêu cầu các cá thể trả về bởi Integer.valueOf phải được lưu trữ trong một phạm vi nhất định.

+0

Đây là một mục blog khá thú vị về sự bình đẳng nguyên thủy/đối tượng: http://marxsoftware.blogspot.com/2010/08/subtle-nuance-of-new-keyword-with.html –

+0

ví dụ này không chứng minh tính bất biến của 'Integer' theo bất kỳ cách nào. ".... nếu thể hiện số nguyên đã được sửa đổi nó sẽ in 6! = 6 để thay thế." OK làm thế nào về lặp đi lặp lại thử nghiệm trên đối tượng biết mutable 'AtomicInteger' ??? nó vẫn sẽ in '6! = 5', ném nước lên đối số trên. – KNU

+0

Lưu ý: đối với thử nghiệm được đề xuất ở trên, người dùng cần sử dụng 'i = new AtomicInteger (6);' thay vì 'i = 6; ' – KNU

-1

Tất cả các lớp trình bao bọc trong java đều không thay đổi. Chúng tôi không thể thay đổi giá trị của đối tượng lớp bao bọc khi được tạo. Đọc Why Strings and wrapper classes are immutable in java? để biết thêm thông tin.

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