首頁 > 軟體

Java static關鍵字詳細解析

2022-08-25 14:02:35

static目的

java中的static關鍵字主要用於記憶體管理。

static範圍

使用範圍:java static關鍵字可以用在變數、方法、程式碼塊和巢狀類中。

作用範圍:static關鍵字屬於類,而不是類的範例。

靜態(static)修飾

  • 變數、方法:稱為類變數/方法、靜態變數/方法;修飾變數或方法,表示這個變數/方法屬於這個類,而不屬於單個物件
  • 程式碼塊:稱為靜態程式碼塊;修飾程式碼塊,表示該程式碼塊為靜態程式碼塊
  • 巢狀類:稱為靜態內部類;修飾內部類,表示該類為靜態內部類。可用於實現單例模式。
  • 可用於修飾import,進行靜態導包,匯入類中所有靜態方法。最常見的使用場景是在JUnit進行單元測試時。

靜態變數

類的成員變數可以分為以下兩種:

  • 靜態變數(或稱為類變數),指被 static 修飾的成員變數。
  • 範例變數,指沒有被 static 修飾的成員變數。

靜態變數與範例變數的區別如下:

1)靜態變數

  • 執行時,Java 虛擬機器器只為靜態變數分配一次記憶體,載入類過程中完成靜態變數的記憶體分配。
  • 在類的內部,可以在任何方法內直接存取靜態變數。
  • 在其他類中,可以通過類名存取該類中的靜態變數。

2)範例變數

  • 每建立一個範例,Java 虛擬機器器就會為範例變數分配一次記憶體。
  • 在類的內部,可以在非靜態方法中直接存取範例變數。
  • 在本類的靜態方法或其他類中則需要通過類的範例物件進行存取。

靜態變數在類中的作用如下:

  • 靜態變數可以被類的所有範例共用,因此靜態變數可以作為範例之間的共用資料,增加範例之間的互動性。
  • 如果類的所有範例都包含一個相同的常數屬性,則可以把這個屬性定義為靜態常數型別,從而節省記憶體空間。例如,在類中定義一個靜態常數 PI。
  • 靜態變數的好處:它能使程式記憶體高效(即它節省記憶體)。

靜態方法

同成員變數,成員方法也可以分為以下兩種:

  • 靜態方法(或稱為類方法),指被 static 修飾的成員方法。
  • 實體方法,指沒有被 static 修飾的成員方法。

靜態方法與實體方法的區別:

靜態方法,屬於類,而不屬於類的物件。

  • 它通過類直接被呼叫,無需建立類的物件。
  • 靜態方法中,不能使用 this 關鍵字,也不能直接存取所屬類的範例變數和實體方法;
  • 靜態方法中,可以直接存取所屬類的靜態變數和靜態方法。
  • 同this 關鍵字,super 關鍵字也與類的範例相關,靜態方法中不能使用 super 關鍵字。

實體方法,可直接存取所屬類的靜態變數、靜態方法、範例變數和實體方法。

靜態方法與靜態變數好處:

  • 屬於類級別,無需建立物件就即可直接使用,使用方便。
  • 全域性唯一,記憶體中唯一,靜態變數可以唯一標識某些狀態。
  • 類載入時候初始化,常駐在記憶體,呼叫快捷方便。

靜態方法與靜態變數缺點:

  • 靜態方法不能呼叫非靜態的方法和變數。 
  • 不能使用this和super關鍵字。

靜態方法與靜態變數適用場景:

  • 靜態方法,最適合工具類中方法的定義;比如檔案操作,日期處理方法等。
  • 靜態方法,適合入口方法定義;比如單例模式,因從外部拿不到建構函式,所以定義一個靜態的方法獲取物件非常有必要。
  • 靜態變數適合全域性變數的定義;舉例:用一個布林型靜態成員變數做控制標誌。

靜態程式碼塊

定義:靜態程式碼塊,是 Java 類中的 static{ } 修飾的程式碼。

作用:用於類初始化時,為類的靜態變數賦初始值,提升程式效能。

靜態程式碼塊的特點如下:

靜態程式碼塊,有點類似於一個方法,但不可以存在於任何方法體內。

靜態程式碼塊,可以置於類中的任何地方,類中可以有多個靜態初始化塊。

Java 虛擬機器器在載入類時執行,將只需要進行一次初始化的操作放在 static 程式碼塊。

類中含多個靜態程式碼塊,Java虛擬機器器將按它們在類中出現的順序依次執行,且都執行一次。

同靜態程式碼塊與靜態,不能直接存取類的範例變數和實體方法,需通過類的物件存取。

靜態類

java中一個類要被宣告為static的,只有一種情況,就是靜態內部類(內嵌類)。如在外部類宣告為static的,程式會編譯都不會通過。

  • 1、靜態內部類,跟靜態方法一樣,只能存取靜態成員變數和方法,不能存取非靜態方法和屬性。
  • 2、普通內部類,可以存取任意外部類的成員變數和方法。
  • 3、靜態內部類,可以宣告普通成員變數和方法,而普通內部類不能宣告static成員變數和方法。 
  • 4、靜態內部類,可以單獨初始化。

可用於實現單例模式。

public class StaticSingleton {
    /**
     * 只有當顯式呼叫getInstance()方法之後,這裡的靜態內部類SingletonHolder才會被載入
     * 從而將INSTANCE初始化
     * 因此,通過靜態內部類實現的單例模式是懶漢式的
     */
    private static class SingletonHolder {  // 通過靜態內部類持有範例
        private static final StaticSingleton INSTANCE = new StaticSingleton();
    }

    private StaticSingleton() { }   // 用private隱藏構造方法

    public static StaticSingleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

static變數儲存在方法區(Method Area)

方法區是被所有執行緒共用,所有欄位和方法位元組碼,以及一些特殊方法,如建構函式,介面程式碼也在此定義,簡單說,所有定義的方法的資訊都儲存在該區域,此區域屬於共用區間。

靜態變數(static)、常數(final)、類資訊(構造方法、介面定義)(Class)、執行時的常數池存在方法區中,但是範例變數存在堆記憶體中,和方法區無關。

到此這篇關於Java static關鍵字詳細解析的文章就介紹到這了,更多相關Java static關鍵 內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com