爲何靜態方法無法調用非靜態成員(方法和變量)

當New 一個對象的時候,並不是先在堆中爲對象開闢內存空間,而是先將類中的靜態方法(帶有static修飾的靜態函數)的代碼加載到一個叫做方法區的地方,然後 再在堆內存中創建對象。所以說靜態方法會隨着類的加載而被加載。當你new一個對象時,該對象存在於對內存中,this關鍵字一般指該對象,但是如果沒有 new對象,而是通過類名調用該類的靜態方法也可以。

靜態方法是屬於類的,動態方法屬於實例對象,在類加載的時候就會分配內存,可以 通過類名直接去訪問,非靜態成員(變量和方法)屬於類的對象,所以只有在對象實例化之後才存在,然後通過類的對象去訪問。

在一個類的靜態成員中去訪問非靜態成員之所以會出錯是因爲在類的非靜態成員不存在的時候靜態成員就已經存在了,訪問一個內存中不存在的東西當然會出錯。

那類是什麼時候被加載呢?在需要調用的時候被加載。

如果靜態方法能調用動態方法的話,那如果別人通過類名調用靜態方法時實例對象可能並不存在,但是方法內又調用了對象的方法,由於對象不存在,所以動態方法也不存在,程序肯定報錯,所以java直接在編譯階段檢查這種錯誤,避免運行時異常

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