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

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.生命週期
類變量生命週期最長,隨着“類”的加載而加載,隨着類的消失而消失
實例變量隨着“對象”的消失而消失

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章