為解決標題問題,首先介紹參數傳遞方法。目前各類程序設計語言的參數傳遞方法主要有三種:
其中按值傳遞表示方法(函數)接收的是調用者提供的變量的拷貝,不改變參數的值;按引用傳遞表示方法(函數)接收的調用者提供的變量地址;按指針傳遞表示方法(函數)接收的是調用者提供的指針的拷貝,不改變指針的值和地址,但可以改變指針所指向的地址。
Java提供的參數傳遞方法,很遺憾只有一種,按值傳遞。也就是說,方法得到的是所有參數值的一個拷貝,方法不能修改傳遞給它的參數變量的內容。
Java的方法參數類型可以分為兩類:
有過Java開發經驗的朋友都知道,對於基本數據類型,Java方法無法改變變量內容。那對自定義類的對象引用是否也不能修改內容呢?可以通過一個簡單的例子說明。代碼如下:
public class MyClass{ private Object num; public MyClass(Object num){ this.num=num; } public Object getNum() { return num; } public void setNum(Object num) { this.num = num; } }
public class Main { public static void change(MyClass myClass){ myClass.setNum(100); } public static void main(String[] args){ MyClass a=new MyClass(10); System.out.println("調用change方法前的值為:"+a.getNum()); change(a); System.out.println("調用change方法後的值為:"+a.getNum()); } }
上面代碼執行輸出結果如下:
從結果中可以看出,change方法能夠修改對象的狀態。也就是說Java方法可以改變對象的參數狀態。那這是否意味著Java方法對於自定義的數據類型(自定義類)的參數采用的是引用傳遞?為了確認結果可以編寫個簡單例子,所有的自定義類仍然是上面的MyClass。代碼如下:
public static void swap(MyClass a,MyClass b){ MyClass tmp=a; a=b; b=tmp; } public static void main(String[] args){ MyClass a=new MyClass(10); MyClass b=new MyClass(100); System.out.println("交換之前a的值為:"+a.getNum()); System.out.println("交換之前b的值為:"+b.getNum()); swap(a,b); System.out.println("交換之後a的值為:"+a.getNum()); System.out.println("交換之後b的值為:"+b.getNum()); } }
執行結果如下:
通過上面結果可以發現,Java方法對自定義類的參數傳遞使用的仍然是值傳遞,不是引用傳遞。那為什麼Java方法能夠修改對象狀態呢?
可以考慮調用change方法的具體執行過程,從中尋找答案。
調用change方法事,具體的執行過程是:
所以,Java方法能夠實現改變對象參數狀態的原因是:方法得到的是對象引用的拷貝,對象引用及方法中的其他拷貝同時引用同一個對象。
現在,總結一下Java的方法參數使用:
三、交換變量的數值
既然已經知其所以然,那麼知其然就不是難事了。直接貼出我的個人代碼:
public static void swap(MyClass a,MyClass b){ Object tmp=a.getNum(); a.setNum(b.getNum()); b.setNum(tmp); }
執行結果如下:
交換有效。
參考文獻:Java核心技術 卷Ⅰ。