JVM視角:值傳遞or引用傳遞?【轉】

  1. 每一個新的函數調用指令(一般是invoke*)會建立一個新的棧幀。
  2. 棧幀中不存在b或者i這種變量名,全部操做都是經過本地變量表和操做數棧完成。
  3. 在方法體執行完畢以後,經過*return將方法體內部的臨時計算結果(一般存放在本地變量表中)返回給調用該方法的方法。如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)來講都只是傳遞了一個對應值的副本。對象



文/elon_wen(簡書做者) 原文連接:http://www.jianshu.com/p/76c092cb8d85 著做權歸做者全部,轉載請聯繫做者得到受權,並標註「簡書做者」。
相關文章
相關標籤/搜索