1. 程式人生 > >關於靜態程式碼塊、非靜態程式碼塊、建構函式、普通成員函式的呼叫順序

關於靜態程式碼塊、非靜態程式碼塊、建構函式、普通成員函式的呼叫順序

import java.util.Scanner;
public class HelloJava {
	static String name;
	static {
		System.out.println(name + "靜態程式碼塊");
	}
	
	public HelloJava(String name)
	{
		this.name=name;
		System.out.println(name + "構造方法");
	}
	public void method()
	{
		System.out.println(name + "成員方法");
	}
	
	{
		System.out.println(name + "非靜態程式碼塊");
	}
	public static void main(String []args)
	{
		HelloJava s1;
		HelloJava s2=new HelloJava("s2");
		HelloJava s3=new HelloJava("s3");
		s3.method();
	}
}

輸出為:
null靜態程式碼塊
null非靜態程式碼塊
s2構造方法
s2非靜態程式碼塊
s3構造方法
s3成員方法


總結:
靜態程式碼塊在宣告類s1的時候就已經運行了,並且由始至終只執行一次
非靜態程式碼塊,在每次建立物件的時候會在構造方法之前執行
構造方法只有在使用new建立物件的時候才會被呼叫
成員方法只有主動呼叫的時候才會執行

這裡因為name是static修飾的靜態成員變數,在建立s2物件時將字串“s2”賦給了name,所以建立s3物件時,重新呼叫了類的靜態程式碼塊,此時name的值還沒有被s3物件所改變,於是就會輸出“s2非靜態程式碼塊”