class TestMain {
/**
* 测试java中参数的传递方式
*
* @param args
*/
public static void main(String[] args) {
StringBuffer strBuf1=new StringBuffer("default1 ");
StringBuffer strBuf2=new StringBuffer("default2 ");
StringBuffer strBuf3=new StringBuffer("default3 ");
do1(strBuf1,strBuf2);
strBuf3=new StringBuffer("New String3");
System.out.println("strBuf1:"+strBuf1);
System.out.println("strBuf2:"+strBuf2);
System.out.println("strBuf3:"+strBuf3);
TestObj tObj1=new TestObj();
TestObj tObj2=new TestObj();
do2(tObj1,tObj2);
System.out.println("tObj1:"+tObj1.a + tObj1.str);
System.out.println("tObj2:"+tObj2.a + tObj2.str);
}
static void do1(StringBuffer strBufA,StringBuffer strBufB){
// 如果是按值传参,将不会改变传入对象strBuf1的值;但结果显示已经改变了传入对象strBuf1的值
strBufA.append(" New String1 ");
// 如果是按引用,将会改变传入对象strBuf2的值;但结果显示没有改变传入对象strBuf2的值?
strBufB=new StringBuffer(" New StringBuffer ");//注意:改变了strBufB的指内存地址,所以没有修改到传入对象strBuf1的值
strBufB.append(" New String2+");
//按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址
}
static void do2(TestObj tObjA,TestObj tObjB){
tObjA =new TestObj();
tObjB.a=200;
tObjB.str=" New Str";
}
}
class TestObj{
int a=100;
String str=" default";
}
/*
运行结果:
strBuf1:default1 New String1
strBuf2:default2
strBuf3:New String3
tObj1:100 default
tObj2:200 New Str
定义按值传递和按引用传递这两个术语是重要的。
按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。
因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。
按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。
因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
在Java语言中
按值传递的数据类型:八种基本数据类型和String(事实上String也是传递的地址但比较特殊,因为他的内容改变就会产生新对象)
按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口
*/