構造方法,靜態代碼,非靜態代碼塊執行順序--代碼分析;

理論

  1. 靜態代碼塊:
    1. 是在當類被載入(內存)時,靜態代碼最先被調用的
    2. 有且只執行一次
    3. 靜態塊常用來執行類屬性的初始化。執行類的載入之前就會調用
  2. 非靜態代碼塊:
    1. 是在當類的對象被創建載入(內存)時,最先被調用
    2. 每創建一個對象,即每載入一個對象,非靜態代碼塊都執行一次
  3. 靜態方法:
    1. 被調用,才執行。
    2. 靜態方法屬於類,即加載完類就可以調用
    3. 加載完對象,也可以用對象調用的到。但是一般不這麼寫
  4. 非靜態方法:
    1. 被調用,才執行。
    2. 非靜態方法屬於對象,即實例化加載完對象才能調用對象。
    3. 不加載對象不能調用
  5. 構造方法
    1. 構造方法構造器用於初始化對象的狀態(數據)
    2. 構造方法在加載完對象後開始執行
    3. 構造方法執行順序在加載完對象的非靜態代碼塊
    代碼:
public class A {  
	public static void staticA() {
		System.out.println("父類-----靜態方法");
	}
	static {  
		System.out.println("父類-----靜態代碼塊");  
	}  
	public A() {  
		System.out.println("父類-----構造函數");  
	}  
	{  
		System.out.println("父類-----非靜態代碼塊");  
	} 
	public void ordinaryA(){
		System.out.println("父類-----普通方法");  
	}

	public static void main(String[] args) {  
		B.staticB();
		//B.ordinaryB();      //錯誤寫法,不可執行
		System.out.println("第一次開始加載B");
		B bno1 = new B();
		System.out.println("開始加載bno1對象的方法");
		bno1.staticB();
		bno1.ordinaryB();
		System.out.println("開始加載A對象");
		A a = new A();
		System.out.println("開始調用A方法");
		a.staticA();
		a.ordinaryA();
		System.out.println("第二次開始加載B");
		B b = new B();
		System.out.println("開始調用B方法");
		b.staticB();
		b.ordinaryB();
	}  
}  

class B extends A {
	public static void staticB(){
		System.out.println("子類-----靜態方法");
	}
	static {  
		System.out.println("子類-----靜態代碼塊");  
	}  
	public B() {  
		System.out.println("子類----構造函數");  
	}  
	{  
		System.out.println("子類-----非靜態代碼塊");  
	}
	public void ordinaryB(){
		System.out.println("子類-----普通方法");  
	}

} 

執行結果:

父類-----靜態代碼塊
第一次開始加載B
子類-----靜態代碼塊
父類-----非靜態代碼塊
父類-----構造函數
子類-----非靜態代碼塊
子類----構造函數
開始加載bno1對象的方法
子類-----靜態方法
子類-----普通方法
開始加載A對象
父類-----非靜態代碼塊
父類-----構造函數
開始調用A方法
父類-----靜態方法
父類-----普通方法
第二次開始加載B
父類-----非靜態代碼塊
父類-----構造函數
子類-----非靜態代碼塊
子類----構造函數
開始調用B方法
子類-----靜態方法
子類-----普通方法

在線運行工具:https://tool.lu/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章