1. 程式人生 > >靜態構造代碼塊、構造代碼塊、構造方法執行的順序問題

靜態構造代碼塊、構造代碼塊、構造方法執行的順序問題

detail [] 原理 article tails 再次 blog art 接下來

/
當前方法的執行結果是什麽?請簡述原理
/
class Demo1 {
static {
Demo2 d = new Demo2();
}
{
System.out.println("我是Demo1的構造代碼塊");
}
public Demo1() {
System.out.println("我是Demo1的構造方法");
}
}
class Demo2 {
static {
Demo1 d = new Demo1();
}
{
System.out.println("我是Demo2的構造代碼塊");
}
public Demo2() {
System.out.println("我是Demo2的構造方法");
}
}
class Test {
public static void main(String[] args) {
Demo2 d2 = new Demo2();
Demo1 d1 = new Demo1();
}
}

執行結果是:
我是Demo2的構造代碼塊
我是Demo2的構造方法
我是Demo1的構造代碼塊
我是Demo1的構造方法
我是Demo2的構造代碼塊
我是Demo2的構造方法
我是Demo1的構造代碼塊
我是Demo1的構造方法

執行原理:
1.程序進入main方法中,程序跳到Demo2 d2 = new Demo2();
這裏要創建Demo2的類對象,需要進到class Demo2裏面
2.程序進入class Demo2 中,這裏存在static靜態構造代碼塊
程序先執行static裏面的語句,Demo1 d = new Demo1(); 程序跳到了class Demo1中
(Demo2裏的 代碼塊 和 構造方法被暫時擱置執行完static後再次執行)
3.當前程序進入了class Demo1裏面 這裏存在static靜態構造代碼塊
先執行static裏面的語句, Demo2 d = new Demo2(); 程序跳到了class裏
(Demo1裏的 代碼塊 和 構造方法被暫時擱置,執行完static後再次執行)

  1. 當前程序進入了class Demo2中,靜態代碼塊執行過,不再執行,構造代碼塊不會單獨執行
    所以程序先跳到public Demo2()上,不進入方法內部,而是調用構造代碼塊
    這裏執行了Demo2裏的構造代碼塊,程序輸出了第一行文字:
    ------------------------------------------“我是Demo2的構造代碼塊”
  2. 當前程序在執行完Demo2裏的代碼塊之後開始執行構造方法裏的語句,輸出第二行文字:
    ------------------------------------------“我是Demo2的構造方法”
  3. 重點來了,程序從這裏執行完之後再次進行跳轉,跳轉到第二次擱置代碼的地方,也就是
    再次跳回到class Demo1裏面,執行剛才被擱置的語句,輸出構造代碼塊構造方法的語句:
    -------------------------------------------“我是Demo1的構造代碼塊”
    -------------------------------------------“我是Demo1的構造方法”
  4. class Demo1中被擱置的代碼執行完之後,程序調到第一次擱置代碼的地方
    也就是第一次進入class Demo2執行後只執行了靜態代碼塊,執行被擱置的語句:
    代碼塊和構造方法
    輸出了兩行語句:
    -------------------------------------------“我是Demo2的構造代碼塊”
    -------------------------------------------“我是Demo2的構造方法”
    到這裏main方法裏面的第一行語句 才完全執行完

7.接下來程序跳到第二行語句 Demo1 d1 = new Demo1();
進入class Demo1裏面去,進去跳到靜態代碼塊上,發現靜態代碼塊已經被執行過,不再執行
程序跳到 構造方法上,執行構造代碼塊,最後執行構造方法
程序會分別輸出語句
-------------------------------------------“我是Demo1的構造代碼塊”
-------------------------------------------“我是Demo1的構造方法”
8.程序執行完畢
---------------------
作者:Szw‘S
來源:CSDN
原文:https://blog.csdn.net/weixin_41334738/article/details/83243832
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

PS:Szw‘s就是我啦~

靜態構造代碼塊、構造代碼塊、構造方法執行的順序問題