对象被覆盖

时间:2019-11-20 21:41:31

标签: java object

我有Java问题-我有这样的对象: GUIItemBuilder

当我尝试使用它时:

GUIItemBuilder item2 = new GUIItemBuilder(is,"def", "123", new ArrayList<>()); //THIS ONE
//A PLACE
GUIItemBuilder item = new GUIItemBuilder(is, "abc", "456", new ArrayList<>());
//B PLACE

并使用getItemStack()函数获取“ item2”的名称,它从“ item”返回我的值-就像“ item2”被覆盖,但不应这样做。发生了什么? 我试图通过在“ A”位置发送item2函数来调试它,这很好,但是当我在“ B”位置发送它时,就像我之前所说的那样,它似乎已被覆盖。

GUIBuilder:https://hastebin.com/wibosudibu.java GUIItemBuilder:https://hastebin.com/ahoxayumij.cpp 命令:

1 个答案:

答案 0 :(得分:0)

要在Andrew的评论中添加完整的细节,您在这里所做的是重复使用同一对象两次。这是一个简化的示例。

@post = Post.find(...)

这将输出

public static class ItemStack {
    public String displayName;
}

public static class Item {
    private ItemStack stack;
    private String name;
     public Item(ItemStack s, String name) {
         this.stack = s;
         this.stack.displayName = name;
         this.name = name;
     }
}
public static void main(String[] args) throws CloneNotSupportedException {
    ItemStack stack = new ItemStack();
    stack.displayName = "Start";
    System.out.println(stack.displayName);
    Item a = new Item(stack, "a");
    System.out.println(stack.displayName);
    Item b = new Item(stack, "b");
    System.out.println(stack.displayName);
}

当您将Start a b 传递给构造函数时,它不会创建它的新副本,而仅使用对其的引用。由于所有这些变量实际上都指向内存中的同一对象,因此对它们所做的任何更改都将在所有这些变量中发生。如果希望这些都是单独的副本,则需要将内容复制到新对象中。对于我的示例,添加一个副本构造器

stack

更改为public ItemStack(ItemStack a) { this.displayName = a.displayName; } ,并更改ItemStack构造函数中的第一行

Item

将给出

的输出
this.stack = new ItemStack(s);