一、參數傳遞方法
為解決標題問題,首先介紹參數傳遞方法。目前各類程序設計語言的參數傳遞方法主要有三種:
1.按值傳遞
2.按引用傳遞
3.按指針傳遞
其中按值傳遞表示方法(函數)接收的是調用者提供的變量的拷貝,不改變參數的值;按引用傳遞表示方法(函數)接收的調用者提供的變量地址;按指針傳遞表示方法(函數)接收的是調用者提供的指針的拷貝,不改變指針的值和地址,但可以改變指針所指向的地址。
二、Java參數傳遞方法
Java提供的參數傳遞方法,很遺憾只有一種,按值傳遞。也就是說,方法得到的是所有參數值的一個拷貝,方法不能修改傳遞給它的參數變量的內容。
Java的方法參數類型可以分為兩類:
1.基本數據類型
2.對象引用
有過Java開發經驗的朋友都知道,對于基本數據類型,Java方法無法改變變量內容。那對自定義類的對象引用是否也不能修改內容呢?可以通過一個簡單的例子說明。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
pubpc class MyClass{ private Object num; pubpc MyClass(Object num){ this .num=num; } pubpc Object getNum() { return num; } pubpc void setNum(Object num) { this .num = num; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
pubpc class Main { pubpc static void change(MyClass myClass){ myClass.setNum( 100 ); } pubpc 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。代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
pubpc static void swap(MyClass a,MyClass b){ MyClass tmp=a; a=b; b=tmp; } pubpc 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方法事,具體的執行過程是:
myClass被初始化成實參a的copy,這是對對象的引用。
setNum方法應用于這個對象的引用。myClass和a同時引用的那個MyClass對象的num變為了100。
方法結束后,參數變量myClass不再使用。而a繼續引用那個num變為100的MyClass對象。如下圖所示。
所以,Java方法能夠實現改變對象參數狀態的原因是:方法得到的是對象引用的拷貝,對象引用及方法中的其他拷貝同時引用同一個對象。
現在,總結一下Java的方法參數使用:
方法不能修改一個基本數據類型的參數;
方法可以改變對象參數的狀態;
方法不能讓對象參數引用一個新的對象(原因參考調用change方法時的具體執行過程)。
三、交換變量的數值
既然已經知其所以然,那么知其然就不是難事了。直接貼出我的個人代碼:
1
2
3
4
5
|
pubpc static void swap(MyClass a,MyClass b){ Object tmp=a.getNum(); a.setNum(b.getNum()); b.setNum(tmp); } |
執行結果如下:
交換有效。
參考文獻:Java核心技術 卷Ⅰ。
以上這篇Java 交換兩個變量的數值實現方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。