用C ++方式思考Java引用

时间:2013-04-11 15:44:57

标签: java c++ object memory reference

在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();

2 个答案:

答案 0 :(得分:5)

我认为背景文字存在轻微的误解:

  

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

Java a" pass-by-reference"语言。它总是按价值传递。传递对象时,您将通过值传递对该对象的引用。当您按值传递指针时,这在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按值分配元素的引用时,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];相同的变量。它只是两个具有相同参考副本的变量。

这有意义吗?

答案 1 :(得分:1)

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

正如评论中的一些人指出的那样,Java引用更像是C ++指针而不是C ++引用,只是区别在于你不必删除它们而且你不能做指针运算。

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

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