首頁 >Java >java教程 >Static 關鍵字:解碼 Java 中的靜態變數

Static 關鍵字:解碼 Java 中的靜態變數

Susan Sarandon
Susan Sarandon原創
2024-10-21 20:12:021059瀏覽

Static Keyword: Decoding Static Variables in Java

歡迎回到Java 關鍵字基礎系列!這篇文章主要是關於靜態變數——Java 中的一個強大功能,可讓您在同一類別的多個物件之間共享資料。

我們將透過實踐範例和見解來介紹靜態變數的目的、行為和關鍵用例。在單獨的貼文中,我們將深入研究靜態方法以避免過多的內容讓您不知所措。

這篇文章建立在先前文章中討論的概念的基礎上。我建議查看最終關鍵字和靜態區塊,以更深入地了解此處涵蓋的主題。


什麼是靜態變數?

靜態變數屬於類別而不是單一實例。它在類別的所有物件之間共享,並且在這些物件之間保留相同的值

主要特徵

  1. 類別級變數:由類別的所有實例共用。
  2. 初始化一次:當類別被 JVM 載入時。
  3. 記憶體位置:儲存在方法區中。
  4. 存取:可以使用類別名稱物件引用(儘管首選類別名稱)來存取。

程式碼範例:動作中的靜態變數

package keywords.static_keyword;

public class StaticVariables {

    // Static variable: Shared across all instances of the class
    // Automatically initialized to default value on class loading
    static int idCounter; // int default value -> 0

    // Static final variables
    // Must be initialized at declaration or in a static block
    static final String COMPANY_NAME = "TechCorp";
    static final String OFFICE_CODE;

    // Instance variables: Unique to each object
    int employeeId;
    String employeeName;

    // Static final variable Initialized in a static block
    static {
       // Default region: US
       String region = System.getProperty("user.region", "US");
        switch (region) {
            case "EU":
                regionalOfficeCode = "EU-01";
                break;
            case "APAC":
                regionalOfficeCode = "AP-11";
                break;
            default:
                regionalOfficeCode = "US-00";
        }
        System.out.println("Static Block Invoked: Office Code set to " +
        regionalOfficeCode);
    }

    // Constructor: Assigns a unique ID to each object
    public StaticVariables(String name) {
        this.employeeName = name;
        this.employeeId = ++idCounter; // Incrementing the shared counter
    }

    // Instance method
    // Displays instance details along with shared data(static variables)
    void displayEmployeeDetails() {
        System.out.println("Employee ID: " + employeeId + 
            ", Name: " + employeeName + 
            ", Company: " + COMPANY_NAME +
            ", Office Code: " + OFFICE_CODE);
    }

    public static void main(String[] args) {
        // Creating instances to observe static variable behavior
        StaticVariables emp1 = new StaticVariables("Alice");
        StaticVariables emp2 = new StaticVariables("Bob");

        emp1.displayEmployeeDetails();
        emp2.displayEmployeeDetails();

        // Accessing the static variable directly using the class name
        System.out.println("Total Employees: " + StaticVariables.idCounter);
    }
}

代碼說明

輸出:

Static Block Invoked: Office Code set to US-00
Employee ID: 1, Name: Alice, Company: TechCorp, Office Code: US-00
Employee ID: 2, Name: Bob, Company: TechCorp, Office Code: US-00
Total Employees: 2

示範的關鍵概念:

  1. 靜態變數:

    • 在所有實例之間共用並在實例之間保留其值。
    • 範例:idCounter 追蹤已建立的員工數量。
  2. 靜態最終變數

    • 其值被分配一次且永不改變的常數。
    • 範例:COMPANY_NAME 和 OFFICE_CODE。
  3. 靜態區塊

    • 載入類別時執行一次
    • 用於根據環境配置初始化OFFICE_CODE等複雜的靜態變數。
  4. 實例變數與方法:

    • 每個實例都有唯一的employeeId 和employeeName 值。
  5. 靜態變數的類別級存取

    • 使用類別名稱存取 idCounter:
    package keywords.static_keyword;
    
    public class StaticVariables {
    
        // Static variable: Shared across all instances of the class
        // Automatically initialized to default value on class loading
        static int idCounter; // int default value -> 0
    
        // Static final variables
        // Must be initialized at declaration or in a static block
        static final String COMPANY_NAME = "TechCorp";
        static final String OFFICE_CODE;
    
        // Instance variables: Unique to each object
        int employeeId;
        String employeeName;
    
        // Static final variable Initialized in a static block
        static {
           // Default region: US
           String region = System.getProperty("user.region", "US");
            switch (region) {
                case "EU":
                    regionalOfficeCode = "EU-01";
                    break;
                case "APAC":
                    regionalOfficeCode = "AP-11";
                    break;
                default:
                    regionalOfficeCode = "US-00";
            }
            System.out.println("Static Block Invoked: Office Code set to " +
            regionalOfficeCode);
        }
    
        // Constructor: Assigns a unique ID to each object
        public StaticVariables(String name) {
            this.employeeName = name;
            this.employeeId = ++idCounter; // Incrementing the shared counter
        }
    
        // Instance method
        // Displays instance details along with shared data(static variables)
        void displayEmployeeDetails() {
            System.out.println("Employee ID: " + employeeId + 
                ", Name: " + employeeName + 
                ", Company: " + COMPANY_NAME +
                ", Office Code: " + OFFICE_CODE);
        }
    
        public static void main(String[] args) {
            // Creating instances to observe static variable behavior
            StaticVariables emp1 = new StaticVariables("Alice");
            StaticVariables emp2 = new StaticVariables("Bob");
    
            emp1.displayEmployeeDetails();
            emp2.displayEmployeeDetails();
    
            // Accessing the static variable directly using the class name
            System.out.println("Total Employees: " + StaticVariables.idCounter);
        }
    }
    

何時使用靜態變數?

  1. 全域計數器:用於追蹤常見狀態,例如ID產生器計數器
  2. 設定設定:儲存保持不變的值,例如應用程式層級設定
  3. 快取:使用靜態變數快取經常使用的資料(注意正確管理記憶體)。

結論

在這篇文章中,我們探討了靜態變數-一個支援跨實例共享狀態的基本功能。了解靜態變數有助於編寫更有效率的程式碼,特別是在管理需要在多個物件之間保持一致的資料時。

下一篇文章中,我們將深入研究靜態方法,探索它們的行為、限制和最佳實踐。


相關貼文

  • Java 基礎

  • 陣列面試重點

  • Java 記憶體基礎

  • 集合架構重點

編碼快樂!

以上是Static 關鍵字:解碼 Java 中的靜態變數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn