static 是面試必考、開發高頻使用的關鍵字。本文從 JVM 類加載機制視角,系統講解靜態成員訪問規則、初始化順序、靜態內部類模式與 import static 用法。
ClassName.staticField、ClassName.staticMethod()public class A {
private int i = 1;
public static void main(String[] args) {
i = 1; // 編譯錯誤:非靜態字段不能在靜態上下文中引用
}
}
根本原因:
三條鐵律:
public class A {
static { System.out.println("A.static block"); }
public A() { System.out.println("A.constructor()"); }
}
public class B extends A {
static { System.out.println("B.static block"); }
public B() { System.out.println("B.constructor()"); }
public static void main(String[] args) {
new B(); new B();
}
}
// 輸出:
// A.static block
// B.static block
// A.constructor()
// B.constructor()
// A.constructor()
// B.constructor()
static { c = 3; System.out.println(c); } // 錯誤:Cannot reference a field before it is defined
private static int c;
static 只能修飾內部類 (非頂級類)。public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}
利用類加載機制天然線程安全、延遲初始化、零同步開銷。
// 導入 Math 所有靜態成員
import static java.lang.Math.*;
public class Test { public static void main(String[] args) { System.out.println(sin(2.2)); } }
// 僅導入 sin 方法
import static java.lang.Math.sin;
優點:減少重複類名前綴。
缺點:降低可讀性 (不知來源)、命名衝突風險。
建議:僅導入特定常用靜態成員,避免 .* 通配導入。