如何在不对影响复制的原始对象进行更改的情况下复制 Java 对象

How to copy Java object without a change to the original affecting the copy

提问人:numberjak 提问时间:12/1/2017 更新时间:12/1/2017 访问量:1317

问:

在函数 addStartNode 中,我创建了一个新的 Node '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
        }
    }
}
Java Linked-List Copy 复制构造函数

评论


答:

3赞 Guillaume Barré 12/1/2017 #1

您已在 Node 类中声明。valuestatic

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

改变:

private static int value;

private 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;
    }
}

Now 不是静态的,那么 Node 的每个实例都将有其适当的值。value

另一方面是静态的,那么它将在 Node 类的所有实例之间共享,因为它是一个类级变量。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 递增的变量相同的变量

评论

0赞 numberjak 12/1/2017
太好了,解决了!我以为我理解静态变量,我想不是。你能解释一下为什么会这样吗?
0赞 VGR 12/1/2017
@numberjak 静态字段是封闭类的所有实例共享的一个值(在本例中为 )。非静态字段意味着封闭类的每个实例都有自己的独立值。DoublyLinkedList.Node
1赞 Guillaume Barré 12/1/2017
@numberjak在我的回答中举了一个小例子