1.問題:
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Test{
public static void main(String[] ars){
A ab = new B(); //執行到此處,結果: ?
System.out.println("");
ab = new B(); //執行到此處,結果: ?
}
}
2.分析: 上面的代碼段結果是什麼?先給出答案:第一處輸出 1a2b,第二次輸出 2b 為什麼? 1.static屬于類,不屬于具體的對象,在java虛拟機JVM在加載類時就會被執行,優先類執行個體化執行。 2.static的存儲區域在全局區域,JVM是為static配置設定一次記憶體,是以static塊程式隻在類第一次加載時運作一次,以後加載都不會再運作。
3.結論 由上分析的兩點可以得出上面的程式執行的結果: A ab = new B(); A和B都是第一次加載,是以先執行靜态塊即輸出1a,緊接着執行個體化 B ,B是A的子類,先執行父類的構造函數,然後執行子類的構造函數,是以緊接着輸出2b。 ab = new B(); 由于不是第一次加載,是以隻執行構造函數輸出2b。
4.舉一反三
class A{
static{
System.out.print("1");
}
public A(){
System.out.print("2");
}
}
class B extends A{
static{
System.out.print("a");
}
public B(){
System.out.print("b");
}
}
public class Test{
public static void main(String[] ars){
B b = new B(); //執行到此處,結果: ?
}
}
變化一下輸出結果為什麼? 按照上面的1、2、3點分析,應該是能得出答案的,理由我不說了,相信認真思考過都可以得出正确答案(1a2b)。 經曆一些實戰後再次更新,更全面的例子:
class A{
static{
System.out.println("static A");
}
{
System.out.println("normal A");
}
public A(){
System.out.println("constructor A");
}
}
class B extends A{
static{
System.out.println("static B");
}
{
System.out.println("normal B");
}
public B(){
System.out.println("constructor B");
}
}
public class Test{
public static void main(String[] ars) throws Exception {
A a = new B();
a = new B();
}
}
如果上面的例子明白輸出結果以及原理,那麼java中關于塊語句執行順序就應該徹底的清楚了。 : )