在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

ref : http://myleslittlewolf.pixnet.net/blog/post/23623695-java%E6%B2%92%E6%9C%89%E6%8C%87%E6%A8%99%3F-%EF%BC%8D-%E6%B7%BA%E8%AB%87%E5%8F%83%E8%80%83(reference)%E8%88%87%E7%89%A9%E4%BB%B6%E7%9A%84%E8%A4%87

arrow
arrow
    全站熱搜

    JerryCheng 發表在 痞客邦 留言(0) 人氣()