b
或者i
這種變量名,全部操做都是經過本地變量表和操做數棧完成。ireturn
返回一個int,areturn
返回一個引用。在本例中調用foo
的方法是main
方法,而foo
方法直接經過不帶任何前綴的return
指令返回,返回的便是一個void
。所以,在main
方法中b
的值不會改變。咱們也能夠簡單的得出結論:對於引用數據類型,Java傳遞的確實是引用!函數
進一步拓展來講,從JVM的層次看,objectref
(對象的引用)會在新幀棧建立時,保存在新棧幀的本地變量表中,而反饋到Java語言層面,相似在函數內部建立了一個形參的副本,以本例來看就是b'
,對於b'
的全部賦值操做都不可能影響到main
方法中的b
,由於不管什麼賦值操做,都只是影響foo
方法對應棧幀中的幾個本地變量而已。但因爲副本b'
保存的內容和b
同樣都是指向一樣的某一塊內存地址,所以在foo
方法內部經過調用字段的setter
方法,能夠將內存中某個字段值改變(經過JVM中的putfield
指令),從而反饋到main
方法中。code
所以咱們能夠獲得這樣的結論:對於基本數據類型,Java傳遞的是值(這個結論在本文中沒有證實);對於引用數據類型,Java傳遞的是引用。無論傳遞的是什麼,從Java語言層面(相對於JVM)來講都只是傳遞了一個對應值的副本。對象