靜態代碼塊、非靜態代碼塊、構造函數的輸出順序


情況一:沒有繼承父類時

 1 class HelloA {
 2     
 3     public HelloA() {
 4         System.out.println("I'm A class");
 5     }
 6 
 7     static {
 8         System.out.println("static A");
 9     }
10     
11     {
12         System.out.println("A");
13     }
14 
15     public static void main(String[] args) {
16         new HelloA();
17         new HelloA();
18     }
19 }

輸出結果:

  static A
  A
  I'm A class
  A
  I'm A class

分析:輸出順序為: 靜態代碼塊>非靜態代碼塊>構造器,同時無論New多少次class靜態代碼塊只執行一次,所以一般情況把耗內存重量級的連接或者其他放在靜態代碼塊中,訪問速度快,並且只訪問一次,節約消耗。

 

情況二:繼承某個父類時

class HelloA extends HelloB{
    
    public HelloA() {
        System.out.println("I'm A class");
    }

    static {
        System.out.println("static A");
    }
    
    {
        System.out.println("A");
    }

    public static void main(String[] args) {
        new HelloA();
    }
}

class HelloB {
    public HelloB() {
        System.out.println("I'm B class");
    }

    static {
        System.out.println("static B");
    }

    {
        System.out.println("B");
    }
}

運行結果:

  static B
  static A
  B
  I'm B class
  A
  I'm A class

分析:輸出順序:父類靜態代碼塊>子類靜態代碼塊>父類非靜態代碼塊>父類構造器>子類非靜態代碼塊>子類構造器;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM