先說結(jié)論
java中方法參數(shù)傳遞方式是按值傳遞顾瞻。
如果參數(shù)是基本類型,傳遞的是基本類型的字面量值的拷貝德绿。
如果參數(shù)是引用類型荷荤,傳遞的是該參量所引用的對象在堆中地址值的拷貝。
再來舉例說明
基本類型作為參數(shù)傳遞
public static void main(String[] args) {
//基本類型作為參數(shù)傳遞
int num = 2;
System.out.println("before change , num = " + num);
changeData(num);
System.out.println("after change , num = " + num);
}
public static void changeData(int num) {
num = 10;
}
輸出結(jié)果為
before change , num = 2
after change , num = 2
通過這個例子移稳,說明基本數(shù)據(jù)類型作為參數(shù)傳遞時蕴纳,傳遞的是值得拷貝,無論怎么改變這個拷貝个粱,原值是不會改變的古毛。
對象作為參數(shù)傳遞
public static void main(String[] args) {
//對象作為參數(shù)傳遞
A a = new A("hello");
System.out.println("before change , a.str = " + a.str);
changeData(a);
System.out.println("after change , a.str = " + a.str);
}
public static void changeData(A a) {
a.str = "hi";
}
class A {
public String str;
public A(String str) {
this.str = str;
}
}
輸出結(jié)果為
before change , a.str = hello
after change , a.str = hi
從結(jié)果來看,對象a被改變了,那么是不是調(diào)用changeData方法時稻薇,傳入的就是a對象本身呢嫂冻?
答案是否定的。
下面我們進(jìn)行分析塞椎,程序從main方法開始執(zhí)行桨仿,首先創(chuàng)建了一個A對象,并定義了一個a引用變量來指向A對象案狠。
接下來服傍,調(diào)用changeData方法,a變量作為實(shí)參傳入changeData方法骂铁,賦值給changeData方法里的形參吹零,從而完成changeData方法的a形參的初始化。
從上圖可以看出拉庵,這種參數(shù)傳遞方式也是值傳遞瘪校,將main方法中a的副本傳入changeData方法,a是一個引用變量名段,所以并未復(fù)制A對象阱扬。
那么,當(dāng)執(zhí)行changeData方法時伸辟,由于a只是一個引用變量麻惶,所以實(shí)際操作的還是堆內(nèi)存中的A對象。因此信夫,不管是操作main中的a窃蹋,還是操作changeData方法中的a,實(shí)際操作的都是堆內(nèi)存中的A對象静稻,是同一個對象警没。
所以,當(dāng)changeData方法中改變了a變量引用的A對象的str值后振湾,main方法中a變量所引用的A對象的str值也被改變了杀迹。
TODO
下面程序的輸出結(jié)果是什么?
public class JavaDemo {
public static void main(String[] args) {
String str = new String("ada");
char[] ch = { 'a', 'b', 'c' };
change(str,ch);
System.out.print(str +" and ");
System.out.print(ch);
}
public static void change(String str, char ch[]) {
str = "ada 111";
ch[0] = 'd';
}
}