-2

我有一个哈希图,我在其中引用了一个对象。

     DateTest test100 = new DateTest("ABC",100); 
     dateTestMap.put(96, test100);

我将此引用变量传递给一个方法,在该方法中我为其分配了一个不同的对象,并在返回后将现有引用指向新对象,如下所示:

    test100 = datePassingTest(test100);

    private DateTest datePassingTest(DateTest test100)
    {
        DateTest newTest = new DateTest("XYZ", 69);
        test100 = newTest;
        return test100;
    }

好吧, test100 确实被修改为指向新对象,但存储在 map 中的值没有得到更新。有什么我想念的吗?

谢谢, 阿迪西亚

4

5 回答 5

1

那是因为test100没有持有使用 this 创建的对象的引用new DateTest("ABC",100);。它现在指向由 this 创建的对象new DateTest("XYZ", 69);

如果您执行了类似的操作test100.setSomething(150),那么更改将反映在地图中。在这种情况下,它不会像test100now 那样引用一个完全不同的对象。

于 2013-10-17T07:46:34.137 回答
1

当你这样做

test100 = newTest

唯一要做的就是 test100 现在引用与 newTest 相同的对象。test100 的原始值所引用的对象仍然存在,但仅存在于哈希图中。

做你想做的事,你应该尝试

test100.setTime(newTest.getTime());
于 2013-10-17T07:48:27.850 回答
0
DateTest test100 = new DateTest("ABC",100); 
dateTestMap.put(96, test100);

在这里,引用(of )的副本位于指向 的 中。现在HashMap包含一个指向一个对象的新引用test100dateTestMapDateTest("ABC",100) dateTestMap DateTest("ABC",100)

所以它可以被描绘成这样

在此处输入图像描述

现在当你做

test100 = datePassingTest(test100);

外部test100指向new DateTest("XYZ", 69),但存在的复制引用dateTestMap仍然指向同一个DateTest("ABC",100)对象。

在此处输入图像描述

Java 是按值传递的——这本质上意味着传递引用的副本

于 2013-10-17T07:48:24.737 回答
0

那是因为,您将对象放入地图中,然后修改对象。因此,地图仍将保留旧对象

 DateTest test100 = new DateTest("ABC",100); 
 dateTestMap.put(96, test100);           // entry/object added to map

 test100 = datePassingTest(test100);     // object updated

 dateTestMap.put(96, test100);           // map gets new object

// now the map contains the updated object but not the older one.
于 2013-10-17T07:48:54.640 回答
0

您没有修改object. 你只是assigning

语言规范 JLS#4.301中的明确解释,

如果两个变量包含对同一对象的引用,则可以使用一个变量对该对象的引用来修改对象的状态,然后可以通过另一个变量中的引用来观察改变的状态。

于 2013-10-17T07:51:43.300 回答