雖然這個模式的名稱已經有人介紹過,但我仍然要以我的方式來介紹它,因為我對這個模式要說的東西比現有的我所能看到的介紹更全面更深入. 一.不變模式需要的基礎.模式雖然顯得高深,但學習它的難度很低,即使你只是一個中級水平的程度員,也可以在很短的時候學會一個模式(當然要能正確地運用那需要豐富的經驗積累).對於基礎知識的深入才是一個優秀的程式員所具備有必要條件. 我下面要說的話不是說國內沒有基礎深厚的java技術人員,而是說沒有基礎深厚卻又能說清楚讓別人也深厚起來的人.簡單說高手隨處可見,但可以做師父的高手我沒有見到.那麼就讓我這個不是高手的人來補一堂Java最最基礎的知識吧. 基礎類型和參考型別的記憶體布局:int x = 1;int y = x;x ++;System.out.println(y);有99.99% 的Java程式員都知道y為1.當把類型為int的變數x作為類型為y的變數的值時,堆棧中會產生一個與x同樣大小的值,但無法改變它們是兩個不同的副本 事實.它們互不相關,僅僅是在”建立” y的依據,完成後它們之間沒有任何關係,既然沒有任何關係,當然修改其中一個就不會影響另一個.這時它們有記憶體布局為: 為了簡化說明參考型別我們用Integer來作為例子.它的值作為它最重要的屬性被表示出來: Integer x = new Integer(100);Integer y = x;這時正確的表述為產生了兩個指向同一對象的變數(或引用).只要看它們的記憶體而局就知道它們的意義了: 對於參考型別,改變引用本身並不影響其它指向同一對象的引用,改變引用本身就是把引用指點向另一個對象,簡單說就是重新賦值.假如 x = new Integer(101);那麼它並不影響y指向原來的100.但改變對象的內容則同時影響其它指向同一引用的變數,因為Integer被設計為不變模式,所以我們目前不能修改它的內容,也就是不能個性100為101.下面的內容中會介紹修改對象內容.對於引用參數傳遞,方法外的引用和方法內的引用雖然變數名在文法相同,但實際變數本身因為作用範圍原因是不同的,但它們都指向同一對象.StringBuffer sb = new StringBuffer("xxxx");amethod(sb){ }這是發生的記憶體而局如下: 在沒有以不變模式來介紹String的時候,我們先來看String類的其它幾個屬性,其實String類要說的東西太多,這裡只說幾個必要的知識: String s1 = “1111”;String s2 = “1111”;String 是唯一可以不通過new來產生對象的類(這隻是對於程式員而言),對於這樣的字面值賦值,其底層就是調用String s1 = new String(“1111”). .intern();即先在字串緩衝池中尋找是否有字元常量”1111”,如果有測將s1指向這個對象.沒有則先建立對象放入字串緩衝池,然後將s1指向它,並銷毀堆中的對象,當String s2 = “1111”;時仍然是調用String s2 = new String(“1111”). .intern();這時已經找到字元常量”1111”,所以s2也指向了字串緩衝池中那個對象,並銷毀了堆中的”1111”,這樣做的結果就是直接賦字面值的語句如果字面值相同它們就都指向同一對象. 因為字串類是不變模式最典型的代表,所以其它的知識將在下面繼續介紹.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1305456