以下爲今天京北方的筆試題: java
-----------------------類A public class A { static { System.out.println("A1"); } public A(){ System.out.println("A2"); } } ---------------類B------------------- public class B extends A{ static { System.out.println("b1"); } public B(){ System.out.println("b2"); } public static void main(String[] args){ A ab = new B(); ab = new B(); } }問輸出結果?當時一會兒給整蒙了,也怪我對static就沒怎麼在乎,因此再看到A ab用父類引用子類的代碼後就一直在這裏打轉了,就寫了個答案abab!哎~差得十萬八千里了。 被static修飾的方法或者變量屬於類,而不屬於對象。因此能夠用類名或者對象名引用這些方法或者變流量,當遇到沒有實例化的聲明時,這些方法仍然會被執行! 結果是
A1 b1 A2 b2 A2 b2
爲何呢?首先A ab 執行A中的靜態方法輸出A1,而後由於沒有構造A1的對象,因此不可能輸出A2;構造了B的對象因此輸出了b1 A2 b2,爲何呢?這裏可就有竅門了。構造B的對象時,先執行靜態代碼塊,靜態代碼塊屬於類,每一個對象均可以執行並且是在構造方法以前執行,輸出b1;接下來執行構造方法,B繼承了A,因此首先執行A的構造方法,輸出了A2,再執行本身的構造方法輸出了b2;最後的A2 b2,由於ab以前指向的是一個B對象的地址,而後再賦予一個B對象的地址,因此不會再執行以前A中的靜態方法,只會執行new B()應該輸出的結果。 spa