在Java中 , 除了primitive data type 之外 , 對於所有的物件都是用reference來指向他.
所以當我們宣告一個Object o1時 , 我們等於是宣告一個reference , 而後面我們便可以將o1 reference到任何的compatible type.
(與c++不同的是 , 在c++宣告reference時 , 便要直接assign一個變數空間給他 , 而在java中 , 可以直接先進行宣告 , 此時這個reference variable為null)
再更進一步解釋:
Object o1 = new Object();
這裡java會allocate出一塊memory , 而o1就是一個reference , reference到這塊memory.
而這個reference的值就是這個memory的位址.
所以當我們以一個reference進行function call時 , 以下面例子來說, c這個reference所儲存的memory address 會傳遞到
Customer cust的cust這個reference , 因此當cust的值進行變動時 , 也會影響到原先c 這個reference所在的memory address.
我們也可以這個是一種call by reference的方式.
public void go()
{
Customer c = new Customer();
c.name = "Justin";
some(c);
System.out.println(c.name);
}
private void some(Customer cust)
{
cust.name = "caterpillar";
}
那物件如何做到call by value , 我們可以藉由object中的clone() method來幫助我們達到這個目的.
Customer c2 = (Customer) cust.clone();
這樣進行操作便不會影響到原本object的值.
同樣地 , 因為在Java來說 , 物件名稱都是一個reference , 所以當我們對兩個object使用assignment時,
其中進行操作的也昰memory address在進行assign.
int x = 10;
int y = x;
Object o1 = new Object();
Object o2 = o1;
(而primitive data type與物件不同 , 是直接存value , 其function call也是以call by value的方式進行 , 並不會動做memory address.)
(這邊與c++不同的是 , c++在進行兩個object的assignment時 , 是直接複製一個object的內容給另外一個)
ref : http://caterpillar.onlyfun.net/Gossip/JavaEssence/CallByValue.html