我有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 命令:
答案 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);