java函数传参

学习下java。

函数传参很有意思。开始还真的迷糊了几分钟。查了点资料,马上就理解了。

Object obj = new Object(); //创建一个对象(在堆中), 并将obj引用指向这个对象。

这里obj不是一个对象了,而是一个对象的引用。这一点和C++是不一样的。

也就是说,java中不能在栈上创建对象。

为什么呐?

我想了一下。可能是这样的,java本身有自动内存清理机制,对象放在堆里面还是栈里面,对于java来说真的不重要。C++中把对象放在栈里面就是这个对象是局部的,应该及时销毁,而放在堆里面就说明这个对象需要多存活一会。


下面讨论函数传参的问题。

void fun( Obj obj )

刚才说了,obj这里是引用值。

根据我对函数调用的理解,函数调用还是栈的那种模型。把参数推进堆栈中,然后通过偏移量进行引用。

这样的话,那把什么值推进堆栈呐,当然是引用的值了,也就是一个地址值。而且这是局部的一个值。栈里面的。

然后通过这个值来操作堆里面的那个对象。

也就是说,你在函数里面改变了这个变量的值,比如你把obj=new Obj()了,相当于obj又指向了新的对象,这个值发生了变化,但是这个值是局部的,局部的意思就是他还只是一个偏移量。

问题是,为什么不能是全局的呐?我函数里面直接改写那个外部的那个obj的值。

那这样的话,你函数里面引用的obj得是明确的地址值了,肯定是要通过偏移量来引用才对,这样,函数才具有扩展性。

说的好绕口啊。自己都有点受不了。

但是感觉自己已经很明白了。

就写到这里了。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值