之所以把這個問題拿出來重新分析一次,是因為我們操作Java的對象(Object)全是通過對象的引用(Object references),引用可以理解為指標,容易讓人對應到C++的傳址上面去。討論討論有百益而無一害嘛。
在傳基礎資料型別 (Elementary Data Type) 變數時,直接傳值不會讓人費解;但當傳遞對象時,就應該理解為傳遞的是對象引用的值,但這個值並不是對象本身,而是指向該對象,即你讓另一個引用指向了該對象。
--Java以By Value的方式傳遞Object reference。
以下面簡單程式為例:
package test;
public class BlogTest
{
public void modifyAAA(int x, java.util.ArrayList list)
{
x += 5;
System.out.println("x=====" + x);
list.add(new java.util.Date());
System.out.println(list.size());
}
public static void main(String[] args)
{
BlogTest blogtest = new BlogTest();
int i = 5;
java.util.ArrayList list = new java.util.ArrayList();
System.out.println("i=======" + i);
System.out.println("list.size()==="+list.size());
blogtest.modifyAAA(i, list);
System.out.println("i==new==" + i);
System.out.println("list.size()====" + list.size());
}
}
/*
運行得到的結果是這樣的
i=======5
list.size()===0
x=====10
1
i==new==5
list.size()==new==1
*/
這說明在參數傳遞過程中發生了以下事情:int 變數 i 被複製了一份給 int x,在modifyAAA()方法中改變了x的值並不會影響主函數中i的值,當然,這是變數生存區間不同,很好理解。但發現list對象的引用傳到modifyAAA()方法的前後,主函數中的list也跟著發生了變化。這正說了在傳遞對象引用時,形參得到了實參對象的引用拷貝,兩個引用都指向了同一list對象,所以形參改變了list同時也能反映到實參中來。