如果乙個物件,在它建立完成之後,不能再改變它的狀態,那麼這個物件就是不可變的。不能改變狀態的意思是,不能改變物件內的成員變數,包括基本資料型別的值不能改變,引用型別的變數不能指向其他的物件,引用型別指向的物件的狀態也不能改變。
jdk1.7中string類的原始碼:
public
final
class
string
implements
serializable, comparable
, charsequence catch (exception e)
}}
列印結果:
str: owen chan
str: owen_chan
在這個過程中,str 始終引用的同乙個string物件,但是再反射前後,這個string物件發生了變化, 也就是說,通過反射是可以修改所謂的「不可變」物件的。這個反射的例項還可以說明乙個問題:如果乙個物件,他組合的其他物件的狀態是可以改變的,那麼這個物件很可能不是不可變物件。例如乙個car物件,它組合了乙個wheel物件,雖然這個wheel物件宣告成了private final 的,但是這個wheel物件內部的狀態可以改變, 那麼就不能很好的保證car物件不可變。
private final static
int array = new
int ;
public
static
void
main(string args)
array[1]:4
public
static
void
main(string args) catch (exception e)
}
列印結果:str1 == str2 : true
str1 == strnew : false
str2 == strnew : false
str1: hello_world
str2: hello_world
strnew: hello_world
分析:
string str1=」hello world」; 和str2都是在常量池裡,指向同乙個物件。所以str和str2是同乙個物件,new string這個是在堆裡。strnew與其他兩個不是同乙個物件。關於後面反射機制修改了str1的值,strnew和str2的值也同步修改了。不管修改哪乙個都會全部修改,所以應該可能是new的時候,查詢了常量池是否存在這個資料,如果存在new出來是乙個指向指標的指標
String原始碼分析
前言 string類在日常開發過程中使用頻率非常高,平時大家可能看過string的原始碼,但是真的認真了解過它麼,筆者在一次筆試過程中要求寫出string的equals方法,瞬間有點懵逼,憑著大致的理解,算是寫出來了,可是下來一翻string的原始碼頓悟,原來自己寫得是多麼的low,所以有必要把這些...
原始碼分析之String
先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...
STL原始碼分析 string
從定義可知,string其實是base string的特化類,string使用預設的記憶體分配器 stl default allocator chart template class alloc stl default allocator chart class basic string typed...