您的位置:首页 > 编程语言 > Java开发

函数传对象调用,为什么值没有发生变化?

2006-11-08 23:14 495 查看
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在调用前后都是指向了同一个堆中对象的地址。

结论:
上述现象跟传对象调用的理论并不本质矛盾,只是需要你对函数的栈调用、和对象的堆生成有所了解! 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  integer string java
相关文章推荐