java中參數傳遞是傳值還是傳引用呢?很多人遇到這個問題都會馬上給你拋出這個例子: 
棧幀(Stack Frame) - 作用:方法在執行的時候,都會有一個棧幀創建出來,用于存儲局部變量表、操作數棧、動態鏈接、方法出口等信息 - 組成: - 局部變量表(Local Variables):存放編譯時可知的各種基本數據類型、對象引用 - 操作數棧(Operand Stacks):供方法調用時進行各種運算 - 動態鏈(Dynamic Linking): - 方法出口
OK,我們再來分析一下上面的問題:

其實呢,Java采用的是傳值(call by value),形參只是實際參數的一個拷貝,形參不能修改實參的內容。
當值為基本數據類型時,swap(int,int)方法中的局部變量a,b接收傳入的值并保存在與該方法對應的棧幀的局部變量表中。而main方法中的a,b保存在main方法對應的棧幀的局部變量表中,修改swap方法中的a,b對main方法中的a,b沒有任何影響,所以交換失敗。
當值為引用類型時,傳入方法的也是它的一個拷貝,當然這個拷貝有點特殊,它是Java Heap中的對象(Entry_e1、Entry_e2)的一個引用。該引用也保存在對應的棧幀的局部變量表中,修改swap方法中的e1,e2的引用指向對main方法中的e1,e2沒有任何影響,所以交換失敗。但局部變量e1,e2可以通過引用改變Heap中的對象的狀態,如第一段代碼中在swap中的局部變量可以通過引用來修改Heap中的對象的value屬性,從而達到交換屬性中的目的。 此外,需要注意的是Java中的某些類如:String、基本類型的包裝類、BigInteger、BigDecimal是不可變的,即無法修改其內容。
最后總結一句:Java是方法調用是值傳遞!
新聞熱點
疑難解答