学习下java。
函数传参很有意思。开始还真的迷糊了几分钟。查了点资料,马上就理解了。
Object obj = new Object(); //创建一个对象(在堆中), 并将obj引用指向这个对象。
这里obj不是一个对象了,而是一个对象的引用。这一点和C++是不一样的。也就是说,java中不能在栈上创建对象。
为什么呐?
我想了一下。可能是这样的,java本身有自动内存清理机制,对象放在堆里面还是栈里面,对于java来说真的不重要。C++中把对象放在栈里面就是这个对象是局部的,应该及时销毁,而放在堆里面就说明这个对象需要多存活一会。
下面讨论函数传参的问题。
void fun( Obj obj )
刚才说了,obj这里是引用值。
根据我对函数调用的理解,函数调用还是栈的那种模型。把参数推进堆栈中,然后通过偏移量进行引用。
这样的话,那把什么值推进堆栈呐,当然是引用的值了,也就是一个地址值。而且这是局部的一个值。栈里面的。
然后通过这个值来操作堆里面的那个对象。
也就是说,你在函数里面改变了这个变量的值,比如你把obj=new Obj()了,相当于obj又指向了新的对象,这个值发生了变化,但是这个值是局部的,局部的意思就是他还只是一个偏移量。
问题是,为什么不能是全局的呐?我函数里面直接改写那个外部的那个obj的值。
那这样的话,你函数里面引用的obj得是明确的地址值了,肯定是要通过偏移量来引用才对,这样,函数才具有扩展性。
说的好绕口啊。自己都有点受不了。
但是感觉自己已经很明白了。
就写到这里了。