1. 程式人生 > >java中靜態方法為什麼不可以呼叫非靜態方法

java中靜態方法為什麼不可以呼叫非靜態方法

重點:static關鍵字的修飾成員變數,成員方法和物件無關。

static修飾的內容是隨著類的載入而載入的,且只加載一次。
它儲存於一塊固定的記憶體區域(靜態區),所以,可以直接被類名呼叫。
它優先於物件存在,所以,可以被所有物件共享

 

 

static可以用來修飾的成員變數和成員方法,被修飾的成員是屬於類的,而不是單單是屬
於某個物件的。也就是說,既然屬於類,就可以不靠建立物件來呼叫了,而是可以直接使用類名來呼叫。

 

java中靜態方法為什麼不可以呼叫非靜態方法?

 

這個要從java的記憶體機制去分析,首先當你New 一個物件的時候,並不是先在堆中為物件開闢記憶體空間,而是先將類中的靜態方法(帶有static修飾的靜態函式)的程式碼載入到一個叫做方法區的地方,然後 再在堆記憶體中建立物件。所以說靜態方法會隨著類的載入而被載入。當你new一個物件時,該物件存在於堆記憶體中,this關鍵字一般指該物件,但是如果沒有 new物件,而是通過類名呼叫該類的靜態方法也可以。

 

程式最終都是在記憶體中執行,變數只有在記憶體中佔有一席之地時才會被訪問,類的靜態成員(靜態和方法)屬於類本身,在類載入的時候就會分配記憶體,可以 通過類名直接去訪問,非靜態成員(變數和方法)屬於類的物件,所以只有在類的物件禪師(建立例項)的時候才會分配記憶體,然後通過類的物件去訪問。

 

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

假如靜態方法可以訪問非靜態方法:首先靜態方法是你在new一個物件的時候首先將靜態方法隨著class檔案一起,被放入到堆中的方法區。然後才會在堆中建立一個物件。也就是說靜態方法已經存在類,非靜態方法還沒有,如果你靜態方法呼叫的非靜態方法一直沒有被建立,那麼就會報錯。。。。。jvm肯定不會冒這個風險,讓你呼叫一個可能不存在的方法,所以就索性在你呼叫的時候就報錯。。。。避免以後不必要的麻煩。