一、先下结论:
基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的;在Java中对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了参数,而不是把引用本身传进去。
二、基本数据类型的传递实例:
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;
}
}
运行结果:
2.2、实例二
public class ParamTransfer {
public int money;
public void amethod(int i) {
System.out.println("方法得到的i的值:" + i);
i = i * 5;
System.out.println("方法执行语句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);
}
}
运行结果:
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();
}
}
运行结果:
三、引用类型的参数传递
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!");
}
}
运行结果:
从结果来看,sb的值被改变了,那么是不是可以说:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。从上面例子的输出结果来看,这样解释是合理。
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!");
}
}
按照上面例子的经验:对象作为参数传递时,是把对象的引用传递过去,如果引用在方法内被改变了,那么原对象也跟着改变。你会认为应该输出:
Before change, sb = Hello
After changeData(n), sb = Hi World!
但是实际是:
运行结果:
分析: