public Test{
public void addThree(Integer srcNum)
{
int num = Integer.parseInteger(srcNum);
num += 3;
srcNum = new Integer(num);
}
public static void main(String[] args)
{
Test test = new Test();
Integer srcNum = new Integer(0);
System.out.println("srcNum1:"+srcNum);//1,打印值为0
test.addThree(srcNum);
System.out.println("srcNum2:"+srcNum);//2,打印值为0
}
}
现象:main函数中,对象srcNum传入到addThree函数后,其值被修改,但是2处打印的值依然为0
分析:
1)按照Java的知识,函数传对象调用,对象被改变了以后,其值也会改变,也就是说2处打印的值应为3;
2)按老的传对象调用的理论似乎无法解释,这里存在一个栈调用问题。
main函数分配的栈我们称为栈A,addThree函数分配的栈我们称为栈B,进入addThree函数以后,所有main函数的变量被压入栈A中,同时在栈B中展开addThree函数中的变量。
一旦完成调用addThree函数以后,所有main函数的变量将出栈A,srcNum的值恢复为调用addThree函数之前的值。
3)实际上,对象是在堆中分配的,栈A中存入的只是指向堆中的一个地址。所谓函数传对象调用,只是说堆中的对象值会改变,而指向该对象的地址则不会改变,所以说这里的srcNum在调用前后都是指向了同一个堆中对象的地址。
结论:
上述现象跟传对象调用的理论并不本质矛盾,只是需要你对函数的栈调用、和对象的堆生成有所了解!