Cra*_*lus 6 c++ java function pass-by-reference
我对以下内容感到困惑:
在C++中,我们可以通过引用将参数传递给函数(将其声明为指针或引用变量),如果我们在函数内部修改它,则当函数返回时,更改会反映给调用者.
这不是在java中发生的,我不确定我理解为什么.
例如,这是来自对象X的方法
public boolean aMethod(int id, myClass aClass)
{
//do some logic
aClass = new MyClass();
//configure argument object aClass
return true;
}
Run Code Online (Sandbox Code Playgroud)
在调用代码中:
//some code processing
myClass obj = null;
if(X.aMethod(2,obj))
{
obj.methodA();//start using the object
}
Run Code Online (Sandbox Code Playgroud)
我在C++中使用它,即返回一个通知可以使用函数参数的结果,但在java中这不起作用.
我输入if(X.aMethod(2,obj))分支,但obj为null.为什么它为空?
我没有在方法aMethod(int id,myClass aClass)中使用new分配堆中的内存地址吗?我没有在函数中传递obj的"地址"吗?我期望在调用代码中正确构造和使用obj.我误解了java中的内存吗?
Amb*_*ber 27
Java按值传递所有内容 - 包括引用.
这意味着如果你传递一个对象,你可以修改该对象的属性,它们会在你返回后保持不变,但你不能用一个全新的对象完全替换该对象,因为你实际上不能修改引用 - 仅引用引用的内容.
aClass =行前:
Outside the function:
obj ---> <foo>
Inside the function:
aClass ---> <foo>
Run Code Online (Sandbox Code Playgroud)
你的aClass =线后:
Inside the function:
aClass ---> <bar>
Outside the function:
obj ---> <foo>
Run Code Online (Sandbox Code Playgroud)
这里要注意的关键是aClass不指向obj- 它指向<foo>.你没有传递地址obj,你传递了obj指向的地址.因此,当你改变aClass指向的东西时,那就不会碰到obj.
作为思考它的另一种方式:
在Java中
Bar foo = new Bar();
Run Code Online (Sandbox Code Playgroud)
相当于C++,
Bar *foo = new Bar();
Run Code Online (Sandbox Code Playgroud)
因此,当您传递foo给函数时,您没有传递地址foo- 您传递的是已分配对象的地址.Java没有&C/C++所做的-operator样式传递引用.