在 Java 中,static 關鍵字主要用於修飾成員變量(屬性)和成員方法(函數)。被 static 修飾後的成員具有以下顯著特點:
ClassName.staticMember,無需實例化物件。this 或 super 關鍵字。主方法 main() 即為靜態方法的典型例子。| 比較維度 | 實例變量(成員變量) | 類變量(靜態變量) |
|---|---|---|
| 生命週期 | 隨物件創建而存在,隨物件被 GC 回收而釋放 | 隨類加載而存在,隨類卸載而消失 |
| 調用方式 | 只能通過物件引用調用 | 可通過物件或類名調用(推薦用類名) |
| 別名 | 實例變量 | 類變量 |
| 內存存儲位置 | 堆內存中的物件內部 | 方法區(元空間)的靜態區 |
以下代碼演示靜態與非靜態成員在內存中的表現:
class Person {
private String name;
private int age;
static String country = "CN";
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(Person.country + ":" + this.name + ":" + this.age);
}
public static void method() {
System.out.println(Person.country);
}
}
class StaticDemo2 {
public static void main(String[] args) {
Person.method(); // 類名調用靜態方法
Person p = new Person("java", 20);
p.show(); // 物件調用實例方法
}
}

StaticDemo2 類,方法區創建類區域,加載 main 方法至棧幀。Person.method(),JVM 在 classpath 下尋找並加載 Person 類至方法區,靜態變量 country 初始化為 "CN"。method() 進棧執行,輸出 "CN",返回後出棧。new Person(),在堆中創建物件,實例變量 name、age 賦值。p.show(),訪問靜態變量 country 及實例變量,輸出結果。main 結束出棧。static {
System.out.println("這是靜態代碼塊");
}
java.lang.Math 類全為靜態方法,無法實例化,故無法用構造函數初始化,必須靠靜態代碼塊完成類初始化。class Demo {
{
System.out.println("這是構造代碼塊");
}
// ...
}
核心區別: 靜態代碼塊隨類加載執行一次;構造代碼塊隨每次實例化執行。