首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 靜態初始化順序深度解析:阿里巴巴筆試題詳解

     編輯:程式設計綜合問答

題目代碼

public class Test1 {
    public static int k = 0;
    public static Test1 t1 = new Test1("t1");
    public static Test1 t2 = new Test1("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");
    { print("構造塊"); }
    static { print("靜態塊"); }
    public Test1(String str) { System.out.println((++k) + " : " + str + " i=" + i + " n=" + n); ++i; ++n; }
    public static int print(String str) { System.out.println((++k) + " : " + str + " i=" + i + " n=" + n); ++n; return ++i; }
    public static void main(String[] args) { Test1 t = new Test1("init"); }
}

輸出結果


1 : t1 i=0 n=0
2 : t2 i=1 n=1
3 : i i=2 n=2
4 : 靜態塊 i=3 n=3
5 : init i=4 n=99
6 : j i=5 n=100
7 : 構造塊 i=6 n=101

初始化順序鐵律

  1. 靜態字段/靜態塊:按**源碼順序**依次執行(父類先於子類)。
  2. 構造器:
    1. 父類構造器(遞歸)。
    2. 實例字段/實例塊:按源碼順序。
    3. 構造器函數體。

逐步推演

步驟執行代碼關鍵狀態變化
1static int k = 0k=0
2static Test1 t1 = new Test1("t1")調用構造器 → 打印第1行 → 此時 i、n 尚未初始化,默認 0
3static Test1 t2 = new Test1("t2")調用構造器 → 打印第2行 → i=1, n=1
4static int i = print("i")調用 print → 打印第3行 → i=2, n=2
5static int n = 99n=99(覆蓋前值)
6static { print("靜態塊") }打印第4行 → n=3 (print 內 ++n)
7main 中 new Test1("init")實例化:實例字段 j=print("j")→第5行;實例塊→第6行;構造器體→第7行

核心考點

  • 靜態字段初始化時,後面的靜態字段仍為默認值(第2步調用構造器時 i=0, n=0)。
  • print 方法修改了靜態變量 i、n,影響後續初始化。
  • 實例化時,**實例字段/塊在構造器體之前**,且每次 new 都執行。

避坑口訣

「靜態按順序,實例按順序,靜態先於實例,父類先於子類」。遇到構造器中訪問靜態字段,**務必確認該字段是否已初始化完成**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved