1. 程式人生 > >為什麼靜態方法不能直接訪問非靜態成員?

為什麼靜態方法不能直接訪問非靜態成員?

static成員是在JVM的CLASSLOADER載入類的時候初始化的,而非static的成員是在建立物件,即new 操作的時候才初始化的;類載入的時候初始化static的成員,此時static 已經分配記憶體空間,所以可以訪問;非static的成員還沒有通過new建立物件而進行初始化,所以必然不可以訪問。

簡單點說:靜態成員屬於類,不需要生成物件就存在了.而非靜態需要生成物件才產生,所以靜態成員不能直接訪問.  

下面說說靜態的特點:

     1.隨著類的載入而載入——靜態會隨著類的消失而消失,說明靜態的生命週期最長

     2.優先於物件的存在——靜態是先存在的,物件是後存在的

     3.被所有物件共享

    4.可以直接被類名多呼叫


靜態的使用注意事項:

1.靜態方法只能訪問靜態成員(包括成員變數和成員方法)

   非靜態方法可以訪問靜態也可以訪問非靜態

2.靜態方法中不可以定義this,super關鍵字

   因為 一個類中,一個static變數只會有一個記憶體空間,雖然有多個類例項,但這些類例項中的這個static變數會共享同一個記憶體空間。靜態方法在優先於物件存在,所以靜態方法中不可以出現this,super關鍵字。

3.主函式是靜態的。

靜態的利弊:

   利:對 物件的共享資料進行單獨空間的儲存,節省空間,沒有必要每一個物件中都儲存一份,可以直接被類名所呼叫

   弊:生命週期過長,訪問出現侷限性(只能訪問靜態)

例項變數和類變數(static宣告的變數)的區別:

1.存放位置

類變數隨著類的載入存在於方法區中,例項變數隨著物件的建立存在於堆記憶體裡

2.生命週期

類變數生命週期最長,隨著“類”的載入而載入,隨著類的消失而消失

例項變數隨著“物件”的消失而消失