java語言中,方法參數有一下幾個注意點:
- 一個方法不能修改一個基本數據類型的參數(即數值型和布爾型)
- 一個方法可以改變一個對象參數的狀態
- 一個方法不能讓對象參數引用一個新的對象
class A{
String name ;
public A(String name){
this.name = name;
}
public A clone(){
return this;
}
}
class WrapperA{
A a ;
public WrapperA(A a){
this.a = a;
}
}
public class demo{
public static void main(String[] args) {
//1.驗證第一條定義
int number1 = 100;
int number2 = 200;
swapNumber(number1, number2);
//結果是 100 200 並沒有改變基本類型
System.out.println(number1+" "+number2);
//2.驗證第二條定義
A testA = new A("testA1");
change(testA);
//結果是testA2 改變了引用類型
System.out.println(testA.name);
//驗證第三條定義
A a1 = new A("1");
A a2 = new A("2");
swapA(a1, a2);
/*結果還是 1 2 並沒有交換 一個方法並不能讓對象參數引用一個新的對象。
原理:
當a1傳入swapA時,複製了一個引用對象x,也就是swapA中的a1
swapA中將x指向了a2
但是a1 並沒有改變
所以改變的僅僅是複製的引用,原來的引用並沒有改變
*/
System.out.println(a1.name+" "+a2.name);
//如果想交換可以使用以下方法
WrapperA wa1 = new WrapperA(a1);
WrapperA wa2 = new WrapperA(a2);
swapWrapperA(wa1, wa2);
a1 = wa1.a;
a2 = wa2.a;
//a1 和 a2 被改變
System.out.println(a1.name+" "+a2.name);
}
//用於測試第一條定義
static void swapNumber(int a , int b){
a += b;
b = a - b;
a = a - b;
}
//用於測試第二條定義
static void change(A a){
a.name = "testA2";
}
//用於測試第三條定義
static void swapA(A a1 , A a2){
A a3 = a1.clone() ;
a1 = a2.clone();
a2 = a3;
System.out.println(a1.name);
}
//交換方法
static void swapWrapperA(WrapperA a1,WrapperA a2){
A a3 = a1.a;
a1.a = a2.a;
a2.a = a3;
}
}