static

zhegeMaw發表於2024-08-12

static可以用來修飾 類 /方法/ 類變數/ static程式碼塊 。

從JVM的類載入機制的角度講,靜態資源是類初始化的時候載入的,而非靜態資源是類new的時候載入的。

一、static類/方法/變數

static修飾類

static修飾方法

靜態方法,方法是屬於類的,可以透過類名.方法名訪問。

  • 場景:想在不建立物件的情況下呼叫某個方法,就可以將這個方法設定為static。

  • 在靜態方法中不能訪問類的非靜態成員變數/非靜態成員方法。(在非靜態成員方法中是可以訪問靜態成員方法/變數的)

  • 靜態方法和靜態變數都存在方法區的並且整個 JVM 只有一份

static修飾變數

類變數,變數是屬於類的,可以透過類名.變數名訪問。

  • 場景:全域性變數,無論單例還是多例該變數都需要全域性共享。

  • 類變數、例項變數

    • 類變數:在類中定義,使用static修飾。類變數被所有的物件所共享,在記憶體中只有一個副本,它當且僅當在類初次載入時會被初始化

    • 例項變數:在類中直接定義,沒有static修飾。例項變數是物件所擁有的,在建立物件的時候被初始化,存在多個副本,各個物件擁有的副本互不影響

    • service標註的類預設單例,只有一個物件

    • 當類是多例時,每次new都會新增一個物件,這時static標註的類變數被不同物件共享,非static標註的例項變數是物件內共享的,物件間不共享。

  • static不允許用來修飾區域性變數。

總結

把同一類事物抽象為類,類有屬性/方法;類例項化為物件,物件也有自己的屬性/方法。

靜態變數它是屬於類的,而非屬於例項物件的屬性;同樣的靜態方法也是屬於類的,普通方法(例項方法)才屬於物件。而Spring容器管理的都是例項物件,包括它的@Autowired依賴注入的均是容器內的物件例項,所以對於static成員是不能直接使用@Autowired注入的。這很容易理解:類成員的初始化較早,並不需要依賴例項的建立,所以這個時候Spring容器可能都還沒“出生”,談何依賴注入呢?

二、類變數、成員變數 、區域性變數

類變數:宣告在類中,方法體之外的變數,但必須宣告為static型別

  • private static int a;

  • 生命週期:隨著類的載入而存在,隨著類的消失而消失

  • 儲存位置:方法區(共享資料區)的靜態區,所以也叫物件的共享資料

成員變數:宣告在類中,方法體之外的變數

  • private int a;

  • 生命週期:隨著物件的建立而存在,隨著物件的回收而釋放

  • 儲存位置:堆記憶體的物件中,所以也叫物件的特有資料

區域性變數:宣告在方法內部

  • int a;

  • 生命週期:作用的範圍結束,變數空間會自動釋放

  • 儲存位置:棧記憶體

參考資料

https://www.cnblogs.com/swisszhang/p/9892992.html

https://www.cnblogs.com/dolphin0520/p/3799052.html

相關文章