在 Java 中,類成員通常需要通過對象實例來訪問。但有時我們希望定義一個成員,其使用完全獨立於該類的任何對象。在成員聲明前加上 static 關鍵字即可創建這樣的靜態成員。被聲明為 static 的成員,能夠在類的任何對象創建之前被訪問,無需引用特定實例。無論是方法還是變量,都可以聲明為 static。最經典的例子就是 main() 方法,因為程序啟動時必須調用它,所以它被聲明為靜態。
聲明為 static 的變量實質上是全局變量。當創建類的對象時,不會產生該靜態變量的副本,而是該類所有實例共享同一個靜態變量。這意味著靜態變量屬於類本身,而非某個具體對象。
靜態方法有以下重要限制:
this 或 super 關鍵字。注意:在靜態方法中引用任何實例變量都是非法的,會導致編譯錯誤。
如果需要通過計算來初始化靜態變量,可以聲明一個靜態塊(static { ... })。靜態塊僅在類被加載時執行一次。以下示例展示了包含靜態方法、靜態變量及靜態初始化塊的類:
// Demonstrate static variables, methods, and blocks.
class UseStatic {
static int a = 3;
static int b;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
static {
System.out.println("Static block initialized.");
b = a * 4;
}
public static void main(String args[]) {
meth(42);
}
}
類加載後,靜態語句依序執行:先將 a 設為 3,執行靜態塊(輸出訊息),再將 b 初始化為 a*4(即 12)。隨後調用 main(),進而調用 meth(42),輸出三個變量值。
在定義它們的類之外,靜態方法和變量能獨立於任何對象而被使用。只需在類名後加點號運算符即可,格式為:classname.method() 或 classname.variable。這就是 Java 實現受控全局功能和全局變量的方式。
class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a = " + a);
}
}
class StaticByName {
public static void main(String args[]) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
}
}
輸出結果:
a = 42
b = 99