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

Java 核心:深入理解 static 關鍵字與靜態成員

     編輯:Java 相關知識

static 關鍵字的核心用途

在 Java 中,static 關鍵字主要用於修飾成員變量(屬性)和成員方法(函數)。被 static 修飾後的成員具有以下顯著特點:

  • 隨類加載而加載: 靜態成員在類被 JVM 載入記憶體時就已初始化完成,不依賴於物件實例。
  • 優先於物件存在: 即使未創建任何該類的實例,靜態成員也已存在於方法區中。
  • 被所有物件共享: 所有實例共享同一份靜態變量的拷貝,任一實例修改都會影響其他實例。
  • 可直接通過類名調用: 語法為 ClassName.staticMember,無需實例化物件。

使用注意事項

  1. 靜態方法限制: 靜態方法只能直接訪問靜態成員(靜態變量、靜態方法);非靜態方法則可訪問靜態與非靜態成員。
  2. 禁用 this/super: 靜態方法屬於類而非實例,因此不能使用 this 或 super 關鍵字。主方法 main() 即為靜態方法的典型例子。

實例變量 vs 類變量(靜態變量)詳細對比

比較維度實例變量(成員變量)類變量(靜態變量)
生命週期隨物件創建而存在,隨物件被 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();         // 物件調用實例方法
    }
}

靜態內存圖解

執行流程解析

  1. 執行 StaticDemo2 類,方法區創建類區域,加載 main 方法至棧幀。
  2. 調用 Person.method(),JVM 在 classpath 下尋找並加載 Person 類至方法區,靜態變量 country 初始化為 "CN"。
  3. method() 進棧執行,輸出 "CN",返回後出棧。
  4. 執行 new Person(),在堆中創建物件,實例變量 name、age 賦值。
  5. 調用 p.show(),訪問靜態變量 country 及實例變量,輸出結果。main 結束出棧。

靜態代碼塊與構造代碼塊

靜態代碼塊

static {
    System.out.println("這是靜態代碼塊");
}
  • 執行時機: 類加載時自動執行,僅執行一次。
  • 用途: 用於類級別的初始化操作。例如 java.lang.Math 類全為靜態方法,無法實例化,故無法用構造函數初始化,必須靠靜態代碼塊完成類初始化。

構造代碼塊(非靜態代碼塊)

class Demo {
    {
        System.out.println("這是構造代碼塊");
    }
    // ...
}
  • 屬於物件: 每次創建物件時都會執行,先於構造函數執行。
  • 用途: 為所有物件提供通用初始化邏輯;構造函數則針對特定物件做個性化初始化。

核心區別: 靜態代碼塊隨類加載執行一次;構造代碼塊隨每次實例化執行。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved