3

在 Java 中,当我们将 java 对象参数传递给方法myMethod((MyObject) myObject)时,基本上就像在 C++ 中传递对对象的引用一样myFunction(& myObject)。在这种情况下,Java 开发人员拥有与 C++ 程序员几乎相同的自由,如果他想传递一个引用,他只传递一个对象,如果他想复制它,他在方法中手动完成。

但这是我的问题:

假设我有三个具有特定类型对象的不同数组MyObject

MyObject[] myObjectsOne

MyObject[] myObjectsTwo

MyObject[] myObjectsThree

我需要单独拥有它们,但我还需要一个替代数组,就像上面提到的这三个的摘要一样 - 例如用作单个对象来显示所有三个的内容。

场景:创建第四个数组,它将表示前三个的值,而实际上不会在任何地方复制这些值。(不为这些值分配额外的内存)

在 C++ 中,我只需创建一个表,其中包含对这三个表中相应对象的引用。

我一直认为在 Java 中它只是为我们制作的,但是当我开始考虑它时,我并不确定。

我们现在还有:MyObject[] myObjectsFour

而且表演完之后..

myObjectsFour[0] = myObjectsOne[0];

..是否访问myObjectsFour[0]myObjectsOne[0]意味着实际上访问内存级别的同一个对象? 就像我理解的那样,它必须是那样的,如果不是的话myObjectsFour[0] = myObjectsOne[0].clone();

4

2 回答 2

5

我认为从背景文字来看有一个轻微的误解:

在 Java 中,当我们将 java 对象参数传递给方法 myMethod((MyObject) myObject) 时,基本上就像在 C++ 中传递对对象的引用,例如 myFunction(& myObject)。

Java不是“按引用传递”的语言。它总是按值传递。当您传递一个对象时,您通过 value传递对该对象的引用。当您按值传递指针时,这在 C++ 中是类似的。

例如,在 Java 中:

public void myMethod(MyObject myObject) {
    myObject = null;
}

作为“MyObject”传递的对象只是值引用。因此将其设置为 null 不会影响传递的原始对象。相应地:

public void myMethod(MyObject myObject) {
    myObject.myIntProperty = 15;
}

如上所述,访问对象的成员是对实际对象进行的,因为它仍然是对该对象的引用。如果有帮助,请将传入的myObject内容视为具有与传递的原始对象的内存位置相同的内存位置的副本:

public void myMethod(MyObject myObject) {}
/* Example memory address: 0x009FC12A in memory, 
   a *copy* of the same address of the object that was passed */

带着这种心态,让我们来看看你的问题。这会产生什么:

myObjectsFour[0] = myObjectsOne[0];

好吧,由于 Java通过 value分配元素的引用,myObjectsFour[0]现在指向完全相同的对象。这表示:

myObjectsFour[0] = myObjectsOne[0];    
myObjectsFour[0].myIntProperty = 15;

也将 的值更改myObjectsOne[0].myIntProperty为 15,就像上面一样。但是这样做:

myObjectsFour[0] = myObjectsOne[0];
myObjectsFour[0] = null; // (or anything else, for that matter)

对 没有影响myObjectsOne[0]。它不是同一个变量,myObjectsFour[0] = myObjectsOne[0];. 它只是两个具有相同引用副本的变量。

那有意义吗?

于 2013-04-11T16:03:37.830 回答
1

是的,您将访问相同的对象。

正如评论中的一些人指出的那样,Java 引用更像是 C++ 指针而不是 C++ 引用,不同之处在于您不必删除它们并且您不能进行指针运算。

当对象被插入到 Java 数组或 Java 集合中时,数据结构指向原始对象,而不是副本。

  • 创建数组或集合的副本时,不会复制其中的对象。新的数据结构指向相同的对象。
  • 当您更改数组或集合中对象的某些内容时,它也会更改该对象添加到的所有其他集合,因为它们都指向同一个对象。
  • 当您从数组或集合中删除对象时,它不会被删除。其他指向它的指针保持有效。(当不再存在其他指向它的指针时,它最终被垃圾收集器删除)。
  • 当一个集合或数组被删除时,它指向的对象不会受到影响(除非垃圾收集器注意到不存在指向它们的其他指针)。
于 2013-04-11T15:52:34.620 回答