為了說明這個問題先給大家出個問題吧:
請看代碼:
public abstract class A {</p><p>public A() {<br />initMethod();<br />}</p><p>public abstract void initMethod();<br />}
public class B extends A {</p><p>static String staticStr = "static1";</p><p>private String testStr = "Test1";</p><p>/*<br /> * (non-Javadoc)<br /> *<br /> * @see A#initMethod()<br /> */<br />public void initMethod() {<br />// TODO Auto-generated method stub<br />testStr = "Test2";<br />staticStr = "static2";<br />}</p><p>/**<br /> * @return the testStr<br /> */<br />public String getTestStr() {<br />return testStr;<br />}</p><p>/**<br /> * @param testStr<br /> * the testStr to set<br /> */<br />public void setTestStr(String testStr) {<br />this.testStr = testStr;<br />}</p><p>/**<br /> * create data: 2009-12-29</br><br /> *<br /> * @author XiangJie<br /> * @param args<br /> *<br /> */<br />public static void main(String[] args) {<br />// TODO Auto-generated method stub<br />B b = new B();<br />System.out.println("the variable testStr is:" + b.testStr);<br />System.out.println("the variable staticStr is:" + B.staticStr);<br />}</p><p>}
大家給出的輸出結果是什麼呢?
當然,這樣的代碼比較奇怪,但是現在只是為了說明這個問題而隨便寫的,在你的項目中遇到的問題有可能不是這樣的。
為瞭解釋這個問題,先不給出代碼,我們來一步步看!
首先,靜態變數初始化的問題,靜態變數初始化是在類載入期間就已經進行了初始化,也就是說當在沒有進行類初始化(註:類載入在類初始化之前)的時候staticStr = "static1"已經被儲存在記憶體中了,而在該問題中你會發現,staticStr = "static2";是在改變已經儲存在記憶體中的值,並且是在初始化之後進行的修改,所以對於靜態變數的列印結果大家應該清楚了吧?
其次,我們來分析類成員變數。
這個就要牽涉到類初始的順序了,B b = new B();就拿這個類的初始化來說明,當進行類的初始化的時候,首先,調用相應的建構函式(註:如果沒有,預設的建構函式為B()),進入建構函式過後,它會首先進入父類的構造器,顯然,我們的initMethod()就是在這種情況下被執行了,也就是說,在此刻的值為testStr = "Test2",父類執行完畢,再進入子類的構造器繼續執行,進入子類過後首先對類成員變數進行初始化,這個就很明確了,現在的testStr="Test1"被執行.
經過上述分析,結果應該很清楚了結果了吧?
呵呵,公布答案了啊!
the variable testStr is:Test1
the variable staticStr is:static2
更多精彩技術文章:http://www.eclipselight.org/rcp/193/