Java:交换对象

Java:交换对象,java,Java,假设我在Java中有没有任何特殊副本构造函数等的常规对象,并且我想在这些对象之间交换,这是否可行: MyObject objTmp; objTmp = obj_1; obj_1 = obj_2; obj_2 = objTmp; 或者我应该像对待引用一样思考它-objTmp引用的是obj_1,在object_1=obj_2之后,最终objTmp也会指向obj_2所以最后一行obj_2=objTmp是无用的,交换失败了? 谢谢,这都是关于引用的,因此它工作正常 在第一次赋值之后,objTmp引用o

假设我在Java中有没有任何特殊副本构造函数等的常规对象,并且我想在这些对象之间交换,这是否可行:

MyObject objTmp;
objTmp = obj_1;
obj_1 = obj_2;
obj_2 = objTmp;
或者我应该像对待引用一样思考它-
objTmp
引用的是
obj_1
,在
object_1=obj_2
之后,最终
objTmp
也会指向
obj_2
所以最后一行
obj_2=objTmp
是无用的,交换失败了?
谢谢,

这都是关于引用的,因此它工作正常

在第一次赋值之后,objTmp引用obj_1引用的对象。 在第二个对象之后,obj_1引用了obj_2引用的对象,因此最好将对第一个对象的引用保存到objTmp中


等等…

通常交换处理价值

在这里,您只是在交换参考资料。

它起作用。 使用
String
类对象尝试下面的代码段

public class Swap {
  public static void main(String[] args) {
    String first = new String("first");
    String second = new String("second");

    System.out.println(first + " :: " + second);

    String temp = first;
    first = second;
    second = temp;

    System.out.println(first + " :: " + second);
  }
}
输出:
第一:第二
第二:第一

最后,
objTmp
也将指向
obj_2

这不会发生。仅仅因为obj_1引用的是
obj_2
,并不意味着更新
objTemp
中的引用


objTmp
将始终指向显式分配给它的引用(
obj_1
)。

MyObject objTmp=new MyObject()
new MyObject()中
是实际对象,
objTmp
对象参考变量,它记录了创建对象的地址

当您执行
obj_1=obj_2
然后本质上是将内存地址从一个变量(或者在本例中是对象引用变量)传递到另一个变量

现在,让我们假设
objTmp
持有一些内存地址
0x4
(请注意,在您的情况下,这并不是因为您没有创建对象)并且
obj_1
持有内存地址
0x8
,现在当您执行
objTmp=obj_1
然后本质上将
0x8
放入
objTmp
中,这意味着您要求
objTmp
对象引用变量指向
0x8
内存地址处的对象

其他代码也是如此。所以,每当你做
obj_1=obj_2基本上是要求对象引用变量指向内存中的另一个对象。现在,如果
obj_1
指向
obj_2
的内存地址,并不意味着
objTmp
也将指向
obj_2
的内存地址,仅仅因为您这样做了
objTmp=obj_1

从概念上讲,需要理解的最重要的事情是
objTmp
obj_1
都是对象引用变量(ORV)并指向堆上的某个内存位置(或在堆上保留内存地址)。当您将一个ORV分配给另一个ORV时,您只是将一个ORV的内存位置放入另一个ORV中。
现在,在代码的后面,如果您将ORV更改为指向某个其他内存位置(通过构造新对象或ORV分配),那么这并不意味着您已分配此ORV的所有其他ORV也将指向新内存地址


是否实现交换由@user3437460得出结论,并在此处解释概念。

您分配的是引用的值,而不是引用本身。因此,上述逻辑是正确的。

假设obj_1和obj_2不为空。 让我分解一下您的代码,一步一步地看看发生了什么:

+------+
| obj1 | <-----obj_1 
+------+
+------+
| obj2 | <-----obj_2 
+------+
+------+

|obj1 |一张图片可以说千言万语,你可以看看我的解决方案。@user3437460谢谢你的回答,我得到了它…你可以将同样的概念应用到Java中其他看似混乱的逻辑上。如果它有帮助,你可以考虑接受我的解决方案;是否实现互换由@user3437460得出结论,并在此处解释概念。
+------+
| obj1 | <-----obj_1 
+------+
+------+
| obj2 | <-----obj_2 
+------+

  null   <-----objTmp 
+------+
| obj1 | <-----obj_1 
+------+ <-----objTmp
+------+
| obj2 | <-----obj_2 
+------+
+------+
| obj1 | <-----objTmp 
+------+ 
+------+
| obj2 | <-----obj_2 
+------+ <-----obj_1
+------+
| obj1 | <-----objTmp 
+------+ <-----obj_2
+------+
| obj2 | <-----obj_1 
+------+