0

次のコードは、エラーや警告なしにコンパイルおよび実行されます。しかし、予期しない結果が得られます。

コード:

import java.util.LinkedList;
import java.util.Scanner;

//defining a custom data-type (class)
class LLObj{
    static int NodeInt;
    static char NodeChar;

    LLObj(int x, char y){
        NodeInt = x;
        NodeChar = y;
    }
}

class LLexp{

    static LinkedList<LLObj> list = new LinkedList<>();

    public static void main(String[] args){

        list.addLast(new LLObj(5,'c'));

        System.out.println(list.get(0).NodeInt);
        System.out.println(list.get(0).NodeChar);

        list.addLast(new LLObj(7,'h'));

        System.out.println(list.get(0).NodeInt);
        System.out.println(list.get(0).NodeChar);
        System.out.println(list.get(1).NodeInt);
        System.out.println(list.get(1).NodeChar);
    }
}

期待される出力-

5
c
5
c
7
h

得られた出力-

5
c
7
h
7
h

  1. なぜこうなった?
  2. 期待される結果を得るにはどうすればよいですか?
4

3 に答える 3

5

これが問題です:

static int NodeInt;
static char NodeChar;

LLObjそれぞれが独自の値を持つことを意図している場合(可能性が高いと思われます)、これらはインスタンス変数である必要があります。

インスタンスフィールド/メソッドと静的フィールド/メソッドの違いを理解することは非常に重要です。詳細については、Javaチュートリアルを参照してください。

于 2013-03-27T09:45:54.917 に答える
1

NodeIntとNodeCharを静的変数として定義しました。静的変数はクラスレベルであり、インスタンスごとに異なる値を保持しません。両方から静電気を取り除き、問題がないはずです。

于 2013-03-27T09:49:59.880 に答える
1
//defining a custom data-type (class)
class LLObj
{
    static int NodeInt;
    static char NodeChar;

    LLObj(int x, char y)
    {
        NodeInt = x;
        NodeChar = y;
    }
}

LLObjクラスから作成するすべてのオブジェクトは、同じデータメンバーを共有します。

静的データメンバーは、開始されたオブジェクトではなく、クラスに関連付けられています。

そして、あなたの例では、LLObjから作成されたすべてのオブジェクトのNodeIntとNodeCharの値は、最後に作成されたオブジェクトの初期値になります。

于 2013-03-27T09:58:32.450 に答える