一、先下結(jié)論:
基本類型作為參數(shù)傳遞時,是傳遞值的拷貝,無論你怎么改變這個拷貝,原值是不會改變的;在Java中對象作為參數(shù)傳遞時,是把對象在內(nèi)存中的地址拷貝了一份傳給了參數(shù),而不是把引用本身傳進去。
二、基本數(shù)據(jù)類型的傳遞實例:
2.1、實例一
public class Test1 {
public static void main(String[] args) {
int n = 3;
System.out.println("Before change, n = " + n);
changeData(n);
System.out.println("After changeData(n), n = " + n);
}
public static void changeData(int n) {
n = 10;
}
}
運行結(jié)果:

image.png
2.2、實例二
public class ParamTransfer {
public int money;
public void amethod(int i) {
System.out.println("方法得到的i的值:" + i);
i = i * 5;
System.out.println("方法執(zhí)行語句i=i*5后i的值:" + i);
System.out.println("money的值:" + this.money);
}
public static void main(String[] args) {
ParamTransfer pt = new ParamTransfer();
pt.money = 100;
pt.amethod(pt.money);
}
}
運行結(jié)果:

image.png
2.3、實例三
package ObjectRef;
public class ObjectRef {
public static void mothed1(){
int x=0;
int y=1;
switchValue(x,y);
System.out.println("x="+x);
System.out.println("y="+y);
}
static void switchValue(int a,int b){
int c=a;
a=b;
b=c;
}
public static void main(String[] args) {
mothed1();
}
}
運行結(jié)果:

image.png
三、引用類型的參數(shù)傳遞
3.1、實例一:貌似是按引用傳遞的實例
package ObjectRef;
public class Test2 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf.append("World!");
}
}
運行結(jié)果:

image.png
從結(jié)果來看,sb的值被改變了,那么是不是可以說:對象作為參數(shù)傳遞時,是把對象的引用傳遞過去,如果引用在方法內(nèi)被改變了,那么原對象也跟著改變。從上面例子的輸出結(jié)果來看,這樣解釋是合理。
3.2、反駁上面的例子
package ObjectRef;
public class Test3 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello ");
System.out.println("Before change, sb = " + sb);
changeData(sb);
System.out.println("After changeData(n), sb = " + sb);
}
public static void changeData(StringBuffer strBuf) {
strBuf = new StringBuffer("Hi ");
strBuf.append("World!");
}
}
按照上面例子的經(jīng)驗:對象作為參數(shù)傳遞時,是把對象的引用傳遞過去,如果引用在方法內(nèi)被改變了,那么原對象也跟著改變。你會認為應該輸出:
Before change, sb = Hello
After changeData(n), sb = Hi World!
但是實際是:
運行結(jié)果:

image.png
分析:

image.png

image.png

image.png

image.png

image.png