天天看點

java 代碼裡面static程式段執行順序

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中關于塊語句執行順序就應該徹底的清楚了。 : )