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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值