Java中非靜態方法是否共用同一塊內存?

轉自:http://cantellow.iteye.com/blog/355044
將某 class 產生出一個 instance 之後,此 class 所有的 instance field 都會新增一份,那麼所有的 instance method 是否也會新增一份?答案是不會,我們用field表示字段,用method表示方法,那麼加上static區分後就 有四種:
class field:有用static修飾的field
class method:有用static修飾的method
instance field:沒有用static修飾的field
instance method:沒有用static修飾的method
那麼他們在內存中的表示爲:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨着每個instance各有一塊記憶體
instance method:共用一塊記憶體
如果instance method也隨着instance增加而增加的話,那內存消耗也太大了,爲了做到共用一小段內存,Java是根據this關鍵字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在傳遞給對象參數的時候,Java編譯器自動先加上了一個this參數,它表示傳遞的是這個對象引用,雖然他們兩個對象共用一個方法,但是他們的方法中所產生的數據是私有的,這是因爲參數被傳進來變成call stack內的entry,而各個對象都有不同call stack,所以不會混淆。其實調用每個非static方法時,Java編譯器都會自動的先加上當前調用此方法對象的參數,有時候在一個方法調用另一個方法,這時可以不用在前面加上this的,因爲要傳遞的對象參數就是當前執行這個方法的對象。
爲什麼靜態方法中不能調用非靜態方法?這是因爲靜態方法直接跟class相關,調用此方法的時候是類直接調用的,而不是對象,所以Java編譯器就沒有對象參數可以傳遞,這樣,如果你在靜態方法內部調用非靜態方法,那麼Java編譯器怎麼判斷這個非靜態方法是哪個對象調用的?對吧,所以Java編譯器就會報錯,但是也不是絕對的,Java編譯器是隱式的傳遞對象參數,那麼我們總可以顯示的傳遞對象參數吧,如果我們把某個對象的引用傳遞到static方法裏,然後通過這個引用就可以調用非靜態方法和訪問非靜態數據成員了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章