<轉>java中靜態方法和非靜態方法的存儲


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

將某 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方法里,然后通過這個引用就可以調用非靜態方法和訪問非靜態數據成員了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM