我对以下内容感到困惑:
在 C++ 中,我们可以通过引用将参数传递给函数(已将其声明为指针或引用变量),如果我们在函数内部修改它,则更改会在函数返回时反射(reflect)给调用者。
这在 Java 中没有发生,我不确定我是否理解为什么。
例如这是来自对象 X 的方法
public boolean aMethod(int id, myClass aClass)
{
//do some logic
aClass = new MyClass();
//configure argument object aClass
return true;
}
在调用代码中:
//some code processing
myClass obj = null;
if(X.aMethod(2,obj))
{
obj.methodA();//start using the object
}
我在 C++ 中使用它,即返回一个结果,通知函数参数可以使用,但在 java 中这不起作用。
我进入 if(X.aMethod(2,obj)) 分支,但 obj 为空。为什么为空?
我不是在方法 aMethod(int id, myClass aClass) 中使用 new 从堆中分配了一个内存地址吗?我不是在函数中传递 obj 的“地址”吗?
我期望在调用代码中正确构造和使用 obj。我是否误解了有关 Java 内存的某些内容?
最佳答案
Java 按值传递所有内容 - 包括引用。
这意味着如果你传递了一个对象,你可以修改那个对象的属性,它们会在你返回后继续存在,但你不能替换整个对象与一个全新的对象,因为您实际上不能修改引用 - 只能修改引用指向的内容。
在你的 aClass =
之前行:
Outside the function:
obj ---> <foo>
Inside the function:
aClass ---> <foo>
在你的 aClass =
之后行:
Inside the function:
aClass ---> <bar>
Outside the function:
obj ---> <foo>
这里要注意的关键是 aClass
不指向 obj
- 它指向 <foo>
.您没有传递 obj
的地址, 你传递的是什么 obj
的地址指向。因此,当您更改 aClass
时指向,不触及 obj
.
作为另一种思考方式:
在 Java 中,
Bar foo = new Bar();
相当于C++,
Bar *foo = new Bar();
因此当你通过 foo
给一个函数,你没有传递 foo
的地址- 您正在传递分配对象的地址。 Java 没有 &
-C/C++ 执行的运算符样式的引用传递。
关于java vs C++ 通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3869570/