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

2021-08-04 12:46:14 字數 890 閱讀 4900

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.生命週期

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

例項變數隨著「物件」的消失而消失

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

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

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

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

靜態方法不能直接訪問非靜態方法

靜態方法不能直接訪問非靜態方法 1 main方法是靜態方法,靜態方法屬於類方法,是類本身去呼叫,不是類的例項去呼叫 2 例項方法,不屬於類的方法,所以必須依靠物件來呼叫 3 靜態方法中訪問另外乙個普通方法,就只能建立乙個物件,因為普通方法依靠物件呼叫 4 靜態方法不能直接訪問非靜態方法,對於靜態方法...