不少同學總是質疑java編程中參數的傳遞,到底是傳值還是傳引用?總是模稜兩可,導致編程涉及到 這方面時很苦惱,關於這個問題,我在這裡記述一下我的理解,歡迎批評指正。
首先鎖定一個根本方向:java中只有傳值!
這裡就有同學納悶了,只有傳值還要傳引用這一說法干嗎?為了便於理解,我們又可以這樣說:
在java中,簡單數據類型是按值傳遞的,對象是按引用傳遞的。。。暈,這人怎麼說話顛三倒四的, 唐僧了。。。。哈哈,莫急,聽我慢慢道來。。。。
1. 所謂傳值,壓棧的是參數值的副本,是把實參的值賦值給形參,對形參的任何修改,都不會影響到 實參的值;
2. 而傳引用(類似於C中的指針),壓棧的是引用的副本,是以地址的方式傳遞參數,傳遞以後,形 參和實參都指向同一個對象,只是他們名字可能不同而已,對形參的修改將影響實參的值。
細心的看客應該意識到了,上邊第2條中,引用的副本本身也是按值傳遞,所以,剛開始那種說法就通 了——java中只有傳值!
看過介紹,再結合下述例子看看是不是就懂了?
Java代碼
package com.test;
class Value {
int i = 10;
}
public class Test {
public static void main(String[] args) {
Test t = new Test();
Value v = new Value ();
int i = 10;
System.out.println("a v.i = " + v.i + ", i = " + i);
t.test(v, i);
System.out.println("c v.i = " + v.i + ", i = " + i);
}
private void test(Value v, int i) {
v.i = 20;
i = 20;
System.out.println("b v.i = " + v.i + ", i = " + i);
}
}
輸出結果為:
a v.i = 10, i = 10
b v.i = 20, i = 20
c v.i = 20, i = 10