Java中如何傳遞實參?
- 2020 年 4 月 2 日
- 筆記
簡介
大家都知道,向方法傳遞對象是一件簡單的事情。然鵝,在某些情況下,傳遞對象與傳遞非對象實參是有些不同的。為了解其間的緣由,你還需要理解兩種向子常式傳遞實參的方法。
夏天悄悄到來了
第一種方法是傳值調用(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不使用簽名進行重載解析。