最近在看到的一個問題,關於Java中方法參數傳遞時究竟是傳值仍是傳引用;html
下列java程序的輸出結果爲____。java
public class Example{ String str=new String("hello"); char[]ch={'a','b'}; public static void main(String args[]){ Example ex=new Example(); ex.change(ex.str,ex.ch); System.out.print(ex.str+" and "); System.out.print(ex.ch); } public void change(String str,char ch[]){ str="test ok"; ch[0]='c'; } }
答案:網站
hello and cb
Java中參數傳遞的規則是基本數據類型傳值,對象類型傳遞引用。那爲何答案與本身的指望值「test ok and cb」不一樣呢?
spa
內存空間中有兩塊地方,分別用來保存str,ch變量code
str="test ok"
代表 change 方法 棧幀中str那塊空間的內存地址0x2AEF更換爲 內容爲「test ok」實例的內存地址0x2ABC;orm
然而main方法 棧幀ex.str 那塊內存空間的值不變,依然是0x2AEF。htm
所以 原來main方法中的ex.str 的內容依然不變對象
hello and cb
change 方法中 str變量 保存的是「hello」內存地址,當進行blog
str="test ok"
時,str變量保存的又是「test ok」內存地址。也就是說你進行的操做是引用的替換,而不是對「hello」那一塊空間的實際內容進行操做。內存
那麼如何對傳進來的對象類型的實例 改變其保存的內容了,除非是該類提供了改變內部值的方法
提供參考網站: