如何复制Java对象而不更改原始对象,从而影响复制

如何复制Java对象而不更改原始对象,从而影响复制,java,linked-list,copy,copy-constructor,Java,Linked List,Copy,Copy Constructor,在函数addStartNode中,我创建了一个新节点“temp”,其值设置为等于“head”。然后我将head设置为一个新节点,其值不同于“v” 但是,当我打印“temp”和“head”的值时,它显示的是相同的内容 我尝试了许多不同的方法,包括复制构造函数,但它似乎没有改变任何东西 任何帮助都会很好 public class DoublyLinkedList { private static class Node { private static int value;

在函数addStartNode中,我创建了一个新节点“temp”,其值设置为等于“head”。然后我将head设置为一个新节点,其值不同于“v”

但是,当我打印“temp”和“head”的值时,它显示的是相同的内容

我尝试了许多不同的方法,包括复制构造函数,但它似乎没有改变任何东西

任何帮助都会很好

public class DoublyLinkedList {

    private static class Node {

        private static int value;

        Node(int v) {
            value = v;
        }

        int getValue() {
            return value;
        }
    }

    private static Node head;

    void addStartNode(int v) {
        if (head == null) {
            head = new Node(v);
        } else {
            Node temp = new Node(head.getValue());
            PRINT VALUES HERE
            head = new Node(v);
            PRINT VALUES HERE
        }
    }
}

您已在节点类中将
value
声明为
static

如果该属性是静态的,则该属性由节点的所有实例共享

更改:

private static int value;

假设您将代码更改为以下代码:

static class Node {

    private static int nbOfNode = 0;
    private int value;

    Node(int v) {
        nbOfNode++;
        value = v;
    }

    int getValue() {
        return value;
    }

    static int getNbOfNode() {
        return nbOfNode;
    }
}
现在
value
不是静态的,那么节点的每个实例都将有其适当的值

另一方面
nbOfNode
是静态的,那么它将在节点类的所有实例之间共享,因为它是一个类级变量

现在,如果运行以下命令:

Node n1 = new Node(11);
System.out.println(n1.getValue());
System.out.println(Node.getNbOfNode());
Node n2 = new Node(22);
System.out.println(n2.getValue());
System.out.println(Node.getNbOfNode());
它将产生:

11-节点n1的正确值

1-递增的共享值

22-节点n2的正确值

2-共享值的第二个增量


在n2的实例化过程中,构造函数将增加与之前通过n1的实例化增加的变量相同的变量

太好了!我以为我理解静态变量,我想不是。您能解释一下为什么这样做吗?@numberjak静态字段是一个由封闭类的所有实例共享的值(在本例中为,
DoublyLinkedList.Node
)。非静态字段意味着封闭类的每个实例都有自己的独立值。@numberjak在我的答案中只举了一个小例子
Node n1 = new Node(11);
System.out.println(n1.getValue());
System.out.println(Node.getNbOfNode());
Node n2 = new Node(22);
System.out.println(n2.getValue());
System.out.println(Node.getNbOfNode());