??
什么是不可變對象?
眾所周知, 在Java中, String類是不可變的。那么到底什么是不可變的對象呢? 可以這樣認為:如果一個對象,在它創(chuàng)建完成之后,不能再改變它的狀態(tài),那么這個對象就是不可變的。不能改變狀態(tài)的意思是,不能改變對象內的成員變量,包括基本數(shù)據(jù)類型的值不能改變,引用類型的變量不能指向其他的對象,引用類型指向的對象的狀態(tài)也不能改變。區(qū)分對象和對象的引用
對于Java初學者, 對于String是不可變對象總是存有疑惑。看下面代碼:String s = "ABCabc";
System.out.println("s = " + s);
s = "123456";
System.out.println("s = " + s);
打印結果為:
s = ABCabc
s = 123456
首先創(chuàng)建一個String對象s,然后讓s的值為“ABCabc”, 然后又讓s的值為“123456”。 從打印結果可以看出,s的值確實改變了。那么怎么還說String對象是不可變的呢? 其實這里存在一個誤區(qū): s只是一個String對象的引用,并不是對象本身。對象在內存中是一塊內存區(qū),成員變量越多,這塊內存區(qū)占的空間越大。引用只是一個4字節(jié)的數(shù)據(jù),里面存放了它所指向的對象的地址,通過這個地址可以訪問對象。 也就是說,s只是一個引用,它指向了一個具體的對象,當s=“123456”; 這句代碼執(zhí)行過之后,又創(chuàng)建了一個新的對象“123456”, 而引用s重新指向了這個心的對象,原來的對象“ABCabc”還在內存中存在,并沒有改變。內存結構如下圖所示: