1. 程式人生 > >Java:類檔案程式執行順序

Java:類檔案程式執行順序

只要按照這個步驟,遇到這一類問題就可以解決了。

1.類中所有屬性的預設值(一舉而成)

2. 父類靜態屬性初始化,靜態塊,靜態方法的宣告(按出現順序執行)

3. 子類靜態屬性初始化,靜態塊,靜態方法的宣告 (按出現順序執行)

4. 呼叫父類的構造方法,

首先父類的非靜態成員初始化,構造塊,普通方法的宣告(按出現順序執行)

然後父類構造方法

5. 呼叫子類的構造方法,

首先子類的非靜態成員初始化,構造塊,普通方法的宣告(按出現順序執行)

然後子類構造方法
      
說明: 1-3:類載入過程,不涉及構造方法

1-5: 例項化過程,涉及構造方法

參考問題:執行下列程式碼,輸出是什麼?

class A {
    public A() {
        System.out.println("A的構造方法");
    }

    public static int j = print();

    public static int print() {
        System.out.println("A print");
        return 521;
    }
}

public class Test1 extends A {
    public Test1() {
        System.
out.println("Test1的構造方法"); } public static int k = print(); public static int print() { System.out.println("Test print"); return 522; } public static void main(String[] args) { System.out.println("main start"); Test1 t1 = new Test1(); } }

看看是不是這個?如果是那麼執行順序掌握的不錯。

A print
Test print
main start
A的構造方法
Test1的構造方法

再來個上題加強版:問輸出順序是什麼?

public class Test1 extends A {
    public Test1() {
        System.out.println("Test1的構造方法");
    }

    public static int k = print();

    {
      System.out.println(k);
    }
    
    public static int print() {
        System.out.println("Test print");
        return 522;
    }

    public static void main(String[] args) {
        System.out.println("main start");
        Test1 t1 = new Test1();
        Test1 t3;
        Test1 t2 = new Test1();
    }
}

class A {
    public A() {
        System.out.println("A的構造方法");
    }

    {
      System.out.println(j);
    }

    public static int j = print();

    static {
      System.out.println(j);
    }

    public static int print() {
        System.out.println("A print");
        return 521;
    }
    static{
      System.out.println("A的static block");
    }

}

看看輸出是不是:

A print
521
A的static block
Test print
main start
521
A的構造方法
522
Test1的構造方法
521
A的構造方法
522
Test1的構造方法

重複輸出的部分:

521
A的構造方法
522
Test1的構造方法

來自於第二次new過程中:執行父類構造體與構造方法->子類構造體與構造方法
而且也可以看出 類的申明不會呼叫類的構造體

原文轉載自:https://www.cnblogs.com/greatfish/p/5771548.html