3

こんにちは、私が抱えている問題を示す簡略化されたコードがいくつかあります。基本的に、それ自体を上書きする代わりに、ArrayList の末尾に追加することはできないようです。助けてください

主要

public class Main {

public static void main(String[] args) {
    HolderOfList h = new HolderOfList();
    h.addToHolder(new Num(2, "Bob"));
    h.addToHolder(new Num(3, "Cat"));
    h.addToHolder(new Num(4, "Dog"));
    h.printAll();
}
}

ArrayList を保持するクラス

import java.util.ArrayList;
import java.util.List;

public class HolderOfList {
List<Num> num;

public HolderOfList() {
    num = new ArrayList<Num>();
}

void addToHolder(Num n) {
    num.add(n);
}

void printAll() {
    for (int i = 0; i < num.size(); i++) {
        System.out.println(num.get(i).getI() + num.get(i).getStr());
    }
}
}

ArrayList に保持されている要素

public class Num {

private static String str;
private static int i;

public Num(int i, String str) {
    this.str = str;
    this.i = i;
}

String getStr() {
    return str;
}

int getI() {
    return i;
}

}

望ましい出力は 2Bob 3Cat 4Dog です

しかし、私が得るのは

4 ドッグ 4 ドッグ 4 ドッグ

私はこの問題を抱えた大規模なプロジェクトを持っていますか?

前もって感謝します

4

1 に答える 1

5

すべての Num インスタンスが同じ単一の変数を効果的に共有するように、Num 変数のstatic修飾子を削除します (実際にはクラスの変数ではありませんが、動作は同じです)。代わりにインスタンス(非静的) 変数にします。

つまり、次のように変更します。

public class Num {
  private static String str;
  private static int i;

これに:

public class Num {
  private String str;
  private int i;

得られた教訓:static修飾子は慎重に使用し、それが理にかなっている場合にのみ使用してください。ここでは意味がありません。

于 2012-10-06T02:18:20.523 に答える