1. 概述
總的來說,計(jì)算機(jī)語言給子程序傳遞參數(shù)的方法有兩種。第一種方法是按值傳遞(call-by-value)。這種方法將一個(gè)參數(shù)值(value)復(fù)制成為子程序的正式參數(shù)。這樣,對子程序的參數(shù)的改變不影響調(diào)用它的參數(shù)。第二種傳遞參數(shù)的方法是引用調(diào)用(call-by-reference)。在這種方法中,參數(shù)的引用(而不是參數(shù)值)被傳遞給子程序參數(shù)。在子程序中,該引用用來訪問調(diào)用中指定的實(shí)際參數(shù)。這樣,對子程序參數(shù)的改變將會(huì)影響調(diào)用子程序的參數(shù)。根據(jù)傳遞的對象不同,Java將使用這兩種不同的方法。
2. 傳遞一個(gè)簡單類型
在Java中,當(dāng)你給方法傳遞一個(gè)簡單類型時(shí),它是按值傳遞的。因此,接收參數(shù)的子程序參數(shù)的改變不會(huì)影響到該方法之外。
我們來看如下例子:
class PassByValue {
public void foo (int i, int j) {
i += 1;
j += 1;
}
}
public class Test {
public static void main(String[] args) {
PassByValue p = new PassByValue();
int i = 1;
int j = 2;
System.out.println("Original values of i and j: " + i + " " + j);
p.foo(i, j);
System.out.println("New values of i and j: " + i + " " + j);
}
}
最后,程序的輸出結(jié)果為:
Original values of i and j: 1 2
New values of i and j: 1 2
可見,在foo函數(shù)內(nèi)的操作并不影響i和j的值,它們并沒有從1和2變?yōu)?code>2和3,說明當(dāng)形參為基本數(shù)據(jù)類型時(shí),Java是傳值方式進(jìn)行的函數(shù)調(diào)用。
3. 傳遞一個(gè)對象
當(dāng)給Java傳遞一個(gè)對象時(shí),它是通過引用傳遞的。這是因?yàn)槲覀冊趧?chuàng)建一個(gè)類類型的變量時(shí),僅僅是創(chuàng)建了一個(gè)類的引用。因此,當(dāng)我們將這個(gè)引用傳遞給一個(gè)方法時(shí),接收它的參數(shù)將會(huì)指向該參數(shù)指向的同一個(gè)對象。
我們來看如下例子:
class PassByReference {
int i, j;
public PassByReference(int i, int j) {
this.i = i;
this.j = j;
}
public void foo(PassByReference p) {
p.i += 1;
p.j += 1;
}
}
public class Test {
public static void main(String[] args) {
PassByReference p = new PassByReference(1, 2);
System.out.println("Original values of i and j: " + p.i + " " + p.j);
p.foo(p);
System.out.println("New values of i and j: " + p.i + " " + p.j);
}
}
最后,程序的輸出結(jié)果為:
Original values of i and j: 1 2
New values of i and j: 2 3
可以看到,在這個(gè)例子中,foo函數(shù)中的操作影響了作為參數(shù)的對象。
4. 結(jié)論
當(dāng)參數(shù)是基本數(shù)據(jù)類型時(shí),是傳值方式調(diào)用;而當(dāng)參數(shù)是引用型的變量時(shí),則是傳址方式調(diào)用。