1. 程式人生 > >靜態屬性靜態程式碼塊載入順序

靜態屬性靜態程式碼塊載入順序

class A {
	private static String staticStr = getStaticStr();
 
	private String str = getStr();
 
	static {
		System.out.println("A的靜態塊");
	}
 
	{
		System.out.println("A的例項塊");
	}
 
	public A() {
		System.out.println("A的構造方法");
	}
 
	private static String getStaticStr() {
		System.out.println("A的靜態屬性初始化");
		return null;
	}
 
	private String getStr() {
		System.out.println("A的例項屬性初始化");
		return null;
	}
}
 
class B extends A {
	private static String staticStr = getStaticStr();
 
	private String str = getStr();
 
	static {
		System.out.println("B的靜態塊");
	}
 
	{
		System.out.println("B的例項塊");
	}
 
	public B() {
		System.out.println("B的構造方法");
	}
 
	private static String getStaticStr() {
		System.out.println("B的靜態屬性初始化");
		return null;
	}
 
	private String getStr() {
		System.out.println("B的例項屬性初始化");
		return null;
	}
 
	public static void main(String[] args) {
		new B();
		new B();
	}
}

輸出結果是:

A的靜態屬性初始化
A的靜態塊
B的靜態屬性初始化
B的靜態塊
A的例項屬性初始化
A的例項塊
A的構造方法
B的例項屬性初始化
B的例項塊
B的構造方法
A的例項屬性初始化
A的例項塊
A的構造方法
B的例項屬性初始化
B的例項塊
B的構造方法

注意:

1.靜態物件不呼叫靜態塊。

2.靜態屬性類載入的時候開闢空間,賦預設值

3.每次建立物件都是類初始化過程。

4.若未呼叫過靜態塊,則建立普通物件是先呼叫靜態塊,再呼叫普通程式碼塊,最後才呼叫構造方法。

5.若static程式碼有多個,JVM按照它們在類中出現的先後順序依次執行它們,每個靜態程式碼塊只會被執行一次。

參考:https://blog.csdn.net/qq_35505699/article/details/71951175