2017-12-01 10 views
1

addStartNode関数では、値が 'head'の値と等しく設定された新しいノード 'temp'を作成します。それから私は値が異なる 'v'の新しいノードになるように頭を設定します。コピーに影響を与える元のものにJavaオブジェクトをコピーする方法

しかし、「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 
     } 
    } 
} 

答えて

3

あなたはNodeクラスにstaticとしてvalueを宣言しました。

属性が静的である場合、Nodeのすべてのインスタンスで共有されます。

変更:

private static int value; 

private int value; 

するにはこの1つにコードを変更する想像:今

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クラスのすべてのインスタンスで共有されます。

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

+0

@numberjak静的なフィールドは、囲むクラスのすべてのインスタンスによって共有される1つの値です(この場合、 'DoublyLinkedList.Node')。非静的フィールドとは、囲むクラスの各インスタンスがそれ自身の独立した値を取得することを意味します。 – VGR

+1

@numberjakちょうど私の答えに小さな例を置く – Nirekin

関連する問題