一文整懂 Java 中靜態代碼塊 / 初始塊 / 構造方法的執行順序

一文整懂 Java 中靜態代碼塊 / 初始塊 / 構造方法的執行順序

 相信,刷過面試題應該都碰到過不少題,關於類繼承後 Java 中靜態代碼塊 / 初始塊 / 構造方法的執行順序問題,往往記一下又忘了,那麼,今天來用很少的時間複習一下面試

01.靜態代碼塊 / 初始塊 / 構造方法的執行順序

package erdan.demo;
public class Demo {
    static {
        System.out.println("靜態代碼塊 111");
    }
    static {
        System.out.println("靜態代碼塊 222");
    }
    {
        System.out.println("初始塊 111");
    }
    {
        System.out.println("初始塊 222");
    }
    public Demo() {
        System.out.println("無參構造方法");
    }
    public Demo(int i) {
        System.out.println("有參構造方法" + i);
    }
    public static void main(String[] args) {
        new Demo();
    }
}

輸出:函數

靜態代碼塊 111
靜態代碼塊 222
初始塊 111
初始塊 222
無參構造方法

上圖:測試

筆記:初始塊(非靜態代碼塊)老是和構造方法是一家子,會一塊出現spa

02.測試繼承以後的執行順序

package erdan.demo;
public class ChildrenDemo extends Demo{
    static {
        System.out.println("ChildrenDemo:靜態代碼塊 111");
    }
    static {
        System.out.println("ChildrenDemo:靜態代碼塊 222");
    }
    {
        System.out.println("ChildrenDemo 初始塊 111");
    }
    {
        System.out.println("ChildrenDemo 初始塊 222");
    }
    public ChildrenDemo() {
        System.out.println("無參構造方法 ChildrenDemo");
    }
    public ChildrenDemo(int i) {
        System.out.println("有參構造方法 ChildrenDemo:" + i);
    }
    public static void main(String[] args) {
        new ChildrenDemo();
        System.out.println("---------------------------------");
        new ChildrenDemo(1);
    }
}

輸出:code

靜態代碼塊 111
靜態代碼塊 222
ChildrenDemo:靜態代碼塊 111
ChildrenDemo:靜態代碼塊 222
初始塊 111
初始塊 222
無參構造方法
ChildrenDemo 初始塊 111
ChildrenDemo 初始塊 222
無參構造方法 ChildrenDemo
---------------------------------
初始塊 111
初始塊 222
無參構造方法
ChildrenDemo 初始塊 111
ChildrenDemo 初始塊 222
有參構造方法 ChildrenDemo:1

能夠看到下面除了調用有參無參的差異外,虛線下比上面少了靜態代碼塊blog

ps:繼承

  • 類比子類先執行
  • 態代碼塊只會輸出一次,初始塊與構造方法是一家子,輸出在一塊,初始塊會在構造前初始化

03.總結

  1. 父類比子類先行執行
  2. 靜態代碼塊,在類第一次加載的時候,會初始化一次,適合項目中初始化全局參數,常量等
  3. 初始塊與構造方法是一家子,可是初始塊會在構造函數前執行,初始塊適合重載構造函數存在相同代碼,能夠抽出來使用

公衆號

相關文章
相關標籤/搜索