Eri*_*aju 3 c++ java memory reference object
在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];
Run Code Online (Sandbox Code Playgroud)
..访问myObjectsFour[0]并myObjectsOne[0]意味着实际访问内存级别的同一个对象?
就像我理解的那样,它必须是那样的,如果不是的话myObjectsFour[0] = myObjectsOne[0].clone();
我认为背景文字有一点误会:
在Java中,当我们将java对象参数传递给方法myMethod((MyObject)myObject)时,它基本上就像传递对C++中对象的引用,如myFunction(&myObject).
Java 不是 "传递参考"语言.它总是按价值传递.传递对象时,您将按值传递对该对象的引用.当您按值传递指针时,这在C++中类似.
例如,在Java中:
public void myMethod(MyObject myObject) {
myObject = null;
}
Run Code Online (Sandbox Code Playgroud)
作为"MyObject"传递的对象仅是值的引用.因此将其设置为null不会影响传递的原始对象.与此相对应:
public void myMethod(MyObject myObject) {
myObject.myIntProperty = 15;
}
Run Code Online (Sandbox Code Playgroud)
如上所述,访问对象的成员对实际对象执行此操作,因为它仍然是对该对象的引用.如果有帮助,可以将传入的内容myObject视为具有与传递的原始对象的内存位置相同的内存位置的副本:
public void myMethod(MyObject myObject) {}
/* Example memory address: 0x009FC12A in memory,
a *copy* of the same address of the object that was passed */
Run Code Online (Sandbox Code Playgroud)
有了这种心态,让我们来看看你的问题.这会产生什么:
myObjectsFour[0] = myObjectsOne[0];
Run Code Online (Sandbox Code Playgroud)
好吧,当Java 按值分配元素的引用时,myObjectsFour[0]现在指向完全相同的对象.这意味着:
myObjectsFour[0] = myObjectsOne[0];
myObjectsFour[0].myIntProperty = 15;
Run Code Online (Sandbox Code Playgroud)
同样将值更改myObjectsOne[0].myIntProperty为15,如上所述.但是这样做:
myObjectsFour[0] = myObjectsOne[0];
myObjectsFour[0] = null; // (or anything else, for that matter)
Run Code Online (Sandbox Code Playgroud)
对...没有影响myObjectsOne[0].声明不是同一个变量myObjectsFour[0] = myObjectsOne[0];.它只是两个具有相同引用副本的变量.
那有意义吗?