【发布时间】:2014-09-17 13:58:50
【问题描述】:
在我发布我的问题之前,我已经阅读了以下关于 java-pass-by-value 的优秀文章。 我确信我已经很好地理解了它。
- Is Java "pass-by-reference" or "pass-by-value"?
- http://www.javaworld.com/article/2077424/learn-java/does-java-pass-by-reference-or-pass-by-value.html
我的问题与 Java 与支持 pass-by-reference 的其他语言的并列比较有关(C++ 可能是)。
在Java 的情况下,您有一个句柄(引用)指向位置A 中的对象。因此可以修改对象本身。但是无法更改对象位置本身。
即存储在内存地址 0X945 中的对象不能更改为 0X948。
在C++等语言中,您可以选择pass-by-value或pass-by-reference。 (它在程序员的手中对吗?)。因此可以正确更改对象在内存空间中的位置吗?
P.S:我在 Java 方面有很好的背景,但在 C++ 方面。所以我上面的观点可能是错误的。
我在上面引用的文章 1 中声称,Java 中没有指针的概念。我不知道这是真的吗? (那为什么NullPointerException存在)
编辑: 考虑这个例子:
void swap(Object A,Object B) {
Object temp=B;
Object B=A;
Oject A=temp;
}
当我在 Java 中调用 swap(A,B) 等方法时,没有任何反应
但在 C++ 中(我想),交换发生了。这可能意味着我正在正确更改内存中对象的位置?
【问题讨论】:
-
Java总是按值传递。
-
@ElliottFrisch:是的,这完全在我的脑海中根深蒂固。但我的问题是可以将对象的位置从内存地址 A 更改为内存地址 B。我认为这在 C++ 等支持引用传递的语言中是可能的吗?
-
没有。这在 Java 中是不可能的,在 C++ 中也是不可能的。
-
如果您传递对指针的引用,则可以在 C++ 中更改对象的位置。 AFAIK 在 java 中不存在等效的功能,但是您可以添加一个间接级别 - 传递(按值)对对象的引用,该对象具有对有问题的对象的引用。这将让您分配目标对象的新实例并让调用者知道它。
-
由于我不懂C++,请见谅。但我认为 swap(Object A, Object B) 在 C++ 中有效,因为您可以交换对象的位置,这在 Java 中是不可能的。那么传递引用与传递值有什么不同呢?
标签: java c++ pointers pass-by-reference pass-by-value