【问题标题】:How to copy Java object without a change to the original affecting the copy如何在不更改影响副本的原始对象的情况下复制 Java 对象
【发布时间】:2017-12-01 12:53:54
【问题描述】:

在函数 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
        }
    }
}

【问题讨论】:

    标签: java linked-list copy copy-constructor


    【解决方案1】:

    您已在 Node 类中将 value 声明为 static

    如果属性是静态的,那么它被所有 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;
        }
    }
    

    现在value 不是静态的,那么每个 Node 实例都会有其正确的值。

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

    现在如果你运行这个:

    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 只是在我的回答中举了一个小例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    • 2019-10-26
    • 2021-10-19
    • 2020-08-09
    • 1970-01-01
    相关资源
    最近更新 更多