gpt4 book ai didi

java - 重写方法参数对象行为

转载 作者:太空宇宙 更新时间:2023-11-04 10:58:33 24 4
gpt4 key购买 nike

public void method (AmazingObject obj) {

HashMap<Integer, AmazingObject> hashmap = new HashMap<>();

for (int i = 0; i < 5; i++) {
obj = new AmazingObject();
hashmap.put(i, obj);
}

for (int i = 0; i < 5; i++) {
System.out.println(hashmap.get(i).toString());
}

}

我编写了这段代码,发现数组中的每个元素都包含完全不同的对象。如果我正确理解这一点:

1) 该方法接受 reference copy AmazingObject 实例的。

2) 我为 reference type 分配了一个新地址通过使用new关键字。

3) 另一个reference copy包含我的新地址的内容被放入 HashMap 中。

因此,之前的值都不会被覆盖。 Java 被通过 reference copy 是这种行为的原因吗?并且不经过reference ?我希望数组中的每个元素都指向末尾完全相同的对象(即最后分配的对象)。

最佳答案

如果我理解正确,您会期望以下代码:

HashMap<Integer, MyObject> hashmap ...    // Line 0
MyObject foo = new MyObject(); // Line 1
hashmap.put(1, foo); // Line 2
foo = new MyObject(); // Line 3
hashmap.put(2, foo); // Line 4

将生成一个 HashMap ,其中两个值相同。

<小时/>

让我们逐步看一下这个示例:

  1. 第 1 行之后
    • 堆栈有 2 个条目/指针(hashmap、foo),它们指向内存对象
    • (1 个 HashMap 和 1 个 MyObject 实例)。
  2. 第 2 行之后
    • 堆栈未更改。
    • HashMap 内存对象现在包含一个条目,该条目将 1 映射到指向 MyObject 实例的指针
  3. 第 3 行之后
    • stack指针foo现在指向堆上的另一个内存位置(新创建的MyObject实例)
    • 现在包含一个 HashMap两个 MyObject 实例
  4. 第 4 行之后
    • 堆栈未更改。
    • HashMap 内存对象现在包含 2 个条目(1 -> 指向第一个 MyObject 实例的指针 | 2 -> 指向第二个 MyObject 实例的指针)
<小时/>

我希望您理解我的意思,但重要的是:变量/参数不是对象本身。它只是一个保存指向内存位置的指针的容器。

因此,如果您将指向内存位置的指针提供给其他任何人(在您的情况下为 HashMap),那么其他位置将不知道变量稍后是否更改!

关于java - 重写方法参数对象行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47139704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com