首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 函数传对象调用,为什么值没有发生变化?
【标  题】:函数传对象调用,为什么值没有发生变化?
【关键字】:
【来  源】:http://blog.csdn.net/waterson/archive/2006/11/08/1374565.aspx

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

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在调用前后都是指向了同一个堆中对象的地址。

结论:
上述现象跟传对象调用的理论并不本质矛盾,只是需要你对函数的栈调用、和对象的堆生成有所了解! 

如何在Tomcat和WebSphere环境中使用LOG4J:【上一篇】
About Hibernate:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 玩转 LMD.Tools.v7.10.for.BDS.2006 基于BCB2006
  • 空指针究竟指向了内存的哪个地方
  • 停止ICS防火墙
  • Microsoft.Web.UI.WebControls怎么设置啊,装了也不行,界面不显示
  • 哪里有用FIREWORK或flash做?张(戳)的教程.
  • solaris下安装的带颜色分辨的ls
  • Windows Vista RTM News: Windows SDK 6.0.6000 & .Ne
  • 对testking的逐个总结分析(1-64题)
  • 虚拟的操作系统比原始的系统更安全
  • Java线程之守护线程(Daemon)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.