java vs C++ 通过引用传递

标签 java c++ function pass-by-reference


我对以下内容感到困惑:
在 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/

相关文章:

java - 如何在 Netbeans 中运行 cucumber 功能文件

java - 在 ComponentListener 中传递 2 个对象以及这些对象

c++ - 在包含文件名中使用项目目录

c++ - 无法从一种迭代器类型转换为另一种,但两者完全相同

javascript - vue js计算属性中的轻微延迟

C 编程 - 重复 scanf 直到仅输入数字

Java:清除 JFrame 并加载新按钮

c++ - 如何将 vector<...> 转换为 cv::Mat?

javascript - jQuery .each() 中的 SetInterval

java - .net 上的 java servlet 等价物是什么