首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java static 關鍵字全解析:靜態變量、方法、代碼塊與初始化順序詳解

     編輯:Java 相關知識

static 核心含義

static 表示「屬於類」而非「屬於實例」。被修飾的成員:

  • 不依賴具體對象,類加載時即在方法區分配記憶體。
  • 所有實例共享同一份副本(節省記憶體)。
  • 可通過 類名.靜態成員 直接訪問,無需創建對象。

靜態變量 vs 實例變量

特性靜態變量實例變量
記憶體分配類加載時一次分配每創建實例分配一次
副本數量單份共享每個實例一份
訪問方式類名/對象均可(推薦類名)僅能通過對象
生命週期隨類卸載結束隨對象銷毀結束

靜態方法限制

  • 不可用 this/super:無實例上下文。
  • 不可直接訪問實例成員:需通過對象引用。
  • 不可為 abstract:必須有具體實現(介面 default/static 方法除外)。
  • 可被繼承但不可覆寫:子類同名靜態方法屬於「隱藏」而非覆寫。

靜態代碼塊:類初始化利器

public class StaticDemo {
    private static int a;
    private int b;

    static { a = 3; System.out.println("靜態塊1: " + a); }
    static { a = 4; System.out.println("靜態塊2: " + a); }
    static { a = 5; System.out.println("靜態塊3: " + a); }

    public StaticDemo() { System.out.println("構造器"); }

    public static void main(String[] args) {
        new StaticDemo();
    }
}
/* 輸出順序:
靜態塊1: 3
靜態塊2: 4
靜態塊3: 5
構造器
*/

執行規則:

  1. 按聲明順序依次執行,僅在類加載時執行一次。
  2. 早於構造器、實例初始化塊。
  3. 常用於靜態資源初始化(連接池、配置解析、單例創建等)。

訪問權限組合

private static int internalCounter;  // 僅類內可見
public static final String VERSION = "1.0"; // 全域常量
protected static void initConfig() {} // 子類可見

private 限制訪問範圍,static 決定存儲方式,兩者正交組合。

main 方法為何是 static?

JVM 啟動時無需實例化主類即可直接調用 public static void main(String[] args),進入程序入口。

常見誤區與最佳實踐

  • ❌ 濫用 static 導致類似全局變數:破壞封裝,難以測試與並發控制。
  • ✅ 工具類方法、常量、單例、緩存 等無狀態/共享狀態場景合理使用。
  • ⚠️ 多執行緒環境下靜態可變狀態需同步:考慮 AtomicInteger、ThreadLocal 或鎖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved