在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();
答案 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集合时,数据结构指向原始对象,而不是副本。