標籤:對象 sys 基本 爭論 方法 round 操作 參數 做什麼
對於基本類型的傳遞,我們很容易理解,而對於對象,總讓人感覺是按引用傳遞,看下面的程式:
public class ObjectRef { //基本類型的參數傳遞
public static void testBasicType(int m) {
System.out.println("m=" + m);//m=50
m = 100;
System.out.println("m=" + m);//m=100
}
//參數為對象,不改變引用的值 ??????
public static void add(StringBuffer s) { //change方法
s.append("_add");
}
test類裡面的:
————————————————————————————————————————————
StringBuffer sMain = new StringBuffer("init");
System.out.println("sMain=" + sMain.toString());//sMain=init
add(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
//傳遞進去引用變數;相當於C++中引用傳遞一樣,被呼叫者法裡面改變了,外面也相應地改變了
changeRef(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
——————————————————————————————————————————————————
//參數為對象,改變引用的值 ?????
public static void changeRef(StringBuffer s) { //changeRef方法
s = new StringBuffer("Java");
}
public static void main(String[] args) {
int i = 50;
testBasicType(i);
System.out.println(i);//i=50
StringBuffer sMain = new StringBuffer("init");
System.out.println("sMain=" + sMain.toString());//sMain=init
add(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
changeRef(sMain);
System.out.println("sMain=" + sMain.toString());//sMain=init_add
}
}
以上程式的允許結果顯示出,testBasicType方法的參數是基本類型,儘管參數m的值發生改變,但並不影響i。
add方法的參數是一個對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,所以s和sMain指向同一個對象,因此,使用s操作影響的其實就是sMain指向的對象,故調用add方法後,sMain指向的對象的內容發生了改變。(好好好)
在changeRef方法中,參數也是對象,當把sMain傳給參數s時,s得到的是sMain的拷貝,但與add方法不同的是,在方法體內改變了s指向的對象(也就是s指向了別的對象,牽著氣球的繩子換氣球了),
給s重新賦值後,s與sMain已經毫無關聯,(兩個有了不同的指向)它和sMain指向了不同的對象,所以不管對s做什麼操作,都不會影響sMain指向的對象,故調用changeRef方法前後sMain指向的對象內容並未發生改變。
(精華精華精華上面那句話)
對於add方法的調用結果,可能很多人會有這種感覺:這不明明是按引用傳遞嗎?對於這種問題,還是套用Bruce Eckel的話:這依賴於你如何看待引用,最終你會明白,這個爭論並沒那麼重要。真正重要的是,你要理解,傳引用使得(調用者的)對象的修改變得不可預期。
實習第二天-java參數傳遞-精華在文章最後2句話