关于java传参
有一个比较经典的例子,如果你能说出此题的结果,说明你是java内存解析能手:
public class Test1 {
public static class ParamTest {
// 初始值为0
protected int num = 0;
// 为方法参数重新赋值
public void change(int i) {
i = 5;
}
// 为方法参数重新赋值
public void change(ParamTest t) {
ParamTest tmp = new ParamTest();
tmp.num = 9;
t = tmp;
}
// 改变方法参数的值
public void add(int i) {
i += 10;
}
// 改变方法参数属性的值
public void add(ParamTest pt) {
pt.num += 20;
}
public static void main(String[] args) {
ParamTest t = new ParamTest();
System.out.println("参数--基本类型");
System.out.println("原有的值:" + t.num);
// 为基本类型参数重新赋值
t.change(t.num);
System.out.println("赋值之后:" + t.num);
// 为引用型参数重新赋值
t.change(t);
System.out.println("运算之后:" + t.num);
System.out.println();
t = new ParamTest();
System.out.println("参数--引用类型");
System.out.println("原有的值:" + t.num);
// 改变基本类型参数的值
t.add(t.num);
System.out.println("赋引用后:" + t.num);
// 改变引用类型参数所指向对象的属性值
t.add(t);
System.out.println("改属性后:" + t.num);
}
}
}
输出结果:
参数--基本类型
原有的值:0
赋值之后:0
运算之后:0
参数--引用类型
原有的值:0
赋引用后:0
改属性后:20
这次听取高手建议,画一个内存图试试:
通过内存图,我们可以很清楚地看到,t.num的值始终都是0,到最后执行add(ParamTest pt)之后其值才变成20,至于前面的三个方法执行的结果都是针对简单变量,或其他对象的num属性,要理解这个例子,我觉得理解参数变量的传值机制很重要,参数是简单变量,则采用值传递,是引用类型变量,则采用引用地址传递。因此,我们可以看到,在执行change(t.num)与add(t.num)之后,t所指向对象的num属性并未发生变化,因为这是值传递,t.num值赋给i,方法对i进行操作,这并不改变num属性。而add(ParamTest pt)与change(ParamTest pt)采用引用传递,方法对传入的引用所指向的对象进行操作。
内存图画得似乎不是很详细,希望和有兴趣的人多多交流。