1. 程式人生 > 其它 >類初始化例項化過程

類初始化例項化過程

public class Father {
    private int i = test();
    private static int j = method();
    static {
        System.out.println("(1)");
    }
    Father(){
        System.out.println("(2)");
    }
    {
        System.out.println("(3)");
    }
    public int test(){
        System.
out.println("(4)"); return 1; } public static int method(){ System.out.println("(5)"); return 1; } }

public class Son extends Father{
    private int i = test();
    private static int j = method();
    static {
        System.out.println("(6)"
); } Son(){ System.out.println("(7)"); } { System.out.println("(8)"); } public int test(){ System.out.println("(9)"); return 1; } public static int method(){ System.out.println("(10)"); return
1; } public static void main(String[] args) { Son s1 = new Son(); } }
  1. 當執行以下操作
public static void main(String[] args) {
//        Son s1 = new Son();
    }

結果如下
在這裡插入圖片描述

類的初始化過程

  • 一個類要建立例項,先載入並初始化該類

    • main方法所在類,需要先載入和初始化
  • 一個子類要初始化需要先初始化父類

  • 一個類的初始化就是執行< clinit>()方法
    這個方法由靜態變數顯示賦值程式碼和靜態程式碼塊組成
    類變數顯示賦值程式碼和靜態程式碼從上到下順序執行,< clinit>()只執行一次

執行以下操作
在這裡插入圖片描述
結果如下
在這裡插入圖片描述

例項初始化過程

父類例項化方法
(1)super()
(2)i = test();
(3) 父類的非靜態程式碼塊
(4) 父類的無參構造(最後)

子類例項化方法 :
(1)super()
(2)i = test();
(3) 子類的非靜態程式碼塊
(4) 子類的無參構造(最後)

在這裡插入圖片描述
為什麼它會在(3)前面和父類的test方法呢?

非靜態方法前面其實有一個預設的物件this
this在構造器或者說在init方法,表示正在建立物件,因為建立Son物件,所有test()執行的是子類重寫的程式碼(面向物件多型)

物件多型性

  • 子類如果重寫了父類方法,通過子類物件呼叫的一定是子類重寫過的程式碼
  • 非靜態方法預設的呼叫物件是this
  • this物件在構造器或者說< init >方法中就是正在建立的物件

例項初始化就是執行< init > () 方法

  1. < init > 方法可能過載有多個,有幾個構造器就有幾個方法
  2. < init > () 方法由非靜態例項化變數顯示賦值程式碼和非靜態程式碼塊組成
  3. 非靜態例項化變數顯示賦值程式碼和非靜態程式碼塊從下到上順序執行,而對應構造器最後執行
  4. 每次建立例項物件,呼叫物件構造器,執行的就是物件< init >方法
  5. < init >方法的首行是super()或者super(引數列表)就是父類的< init >