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 靜態方法不能直接訪問非靜態方法,對於靜態方法...