Java中如何傳遞實參?

簡介

大家都知道,向方法傳遞對象是一件簡單的事情。然鵝,在某些情況下,傳遞對象與傳遞非對象實參是有些不同的。為了解其間的緣由,你還需要理解兩種向子常式傳遞實參的方法。

夏天悄悄到來了

第一種方法是傳值調用(call-by-value)。這種方法吧實參值複製到子常式的形參中。因此,對子常式形參的修改不會影響調用中的實參。第二種傳遞實參的方法是引用調用(call-by-reference)。在這種方法中。傳遞給形參的是實參的引用(不是實參值)。在子常式內部,這個引用被用於訪問調用中指定的實參。這就意味著對形參的修改會影響用於調用子常式的實參。你將看到,雖然Java使用傳值調用來傳遞實參,但是傳遞基本類型與傳遞引用類型的效果是不同的。

丘比特愛神之箭

當向方法傳遞基本類型時,如 int 或 double ,傳遞的是值,因此將創建實參的副本,無論接收實參的形參發生什麼事情,都不會對方法以外產生影響。例如:

(可以左右滑動查看)

class Test{           void noChange(int i,int j){     i = i + j;     j = -j;           }  }    class CallByValue{   public static void main(String srgs[]){    Test ob = new Test();    int a = 15, b = 20;    System.out.println("a and b before call: " + a + " " + b);    ob.noChange(a,b);    System.out.println("a and b after call: " + a + " " + b);   }  }                                      

程式的輸出如下所示:

a and b before call: 15 20  a and b after call: 15 20                                       

如你所見,在noChange()內部發生的運算沒有影響調用中使用的 a 和 b 的值。

夏季喝冷飲最配哦~

當向方法傳遞對象時,情況就不大一樣了,因為對象是通過引用來傳遞的。切記,當創建類類型的變數時,就在創建對象的引用。實際傳遞給方法的是引用而不是對象本身。因此,當向方法傳遞引用時,接收引用的形參與實參會指向同一對象。這就意味著向方法傳遞對象使用的時引用調用。方法內部對對象的修改就會影響作為實參的對象。例如:

(可以左右滑動查看)

class Test{   int a, b;   Test(int i, int j){    a = i;    b = j;   }   void change(Test ob){    ob.a = ob.a + ob.b;    ob.b = -ob.b;   }  }    class PassObRef{   public static void main(String args[]){    Test ob = new Test(15, 20);    System.out.println("ob.a and ob.b before call: " + ob.a + " " + ob.b);    ob.change(ob);    System.out.println("ob.a and ob.b after call: " + ob.a + " " + ob.b);   }  }                                       

程式的輸出如下所示:

ob.a and ob.b before call: 15 20  ob.a and ob.b after call: 35 -20                                   

如你所見,change()內部的動作影響了作為實參使用的對象。

記住,當對象引用被傳遞給方法時,引用本身時使用傳值調用方式傳遞的。然鵝,因為被傳遞的值引用了一個對象,所以該值的副本依然引用了被相應實參引用的同一個對象。

每周

問答

問:我聽Java程式設計師提到過「簽名」這個術語,它指的是什麼?

答:在Java中,簽名(signature)指的是方法名及其形參列表。因此,在重載時,一個類中的兩個方法不能具有相同的簽名。注意,簽名不包含返回類型,因為Java不使用簽名進行重載解析。