2011-02-04 12 views
1

私の配列の各要素が再割り当てされているように見えるという問題があります。オブジェクト配列の割り当て問題

class Car { 
    private static int nom = 0; 
    private static String whee = ""; 
    public void setCar(int r, String s) { 
     this.nom = r; 
     this.whee = s; 
    } 
} 

class Rawr { 
    private Car[] jar = new Car[3]; 

    public Mar() { 
     jar[0] = new Car(); 
     jar[1] = new Car(); 
     jar[2] = new Car(); 
     jar[0].setCar(2, "yar"); 
     jar[1].setCar(3, "tar"); 
     jar[2].setCar(4, "sars"); 
    } 
} 

私はjar[0].nom + jar[0].whee + jar[1].nom + jar[2].whee + jar[3].wheeようにそれを印刷した場合、出力はそれはあなたの変数が静的であるため、すなわち、彼らはクラスにではなく、インスタンスに属しているのです

4 sars 4 sars sars 
+0

ようこそStackOverflow。あなたの質問をしていたときの右側に、この便利な**フォーマット方法**ボックスがありました。 ** [?] **の質問エリアのすぐ上にある[page linked](http://stackoverflow.com/editing-help)のように、読む価値があります。あなたがあなたのクエストを書いているとき、それがテキストボックスの下にどのように見えるかのプレビューがあります。 –

答えて

6

だろう。この意味の詳細については、Java Tutorials | Understanding Instance and Class Membersをご覧ください。

キーワードがインスタンス変数になるように、staticキーワードを削除する必要があります。

private int nom = 0; 
private String whee = ""; 

static

+0

あなたは正しいです! ;) –

5

変更

private static int nom = 0; 
private static String whee = ""; 

は、変数はすべてのインスタンスで共有されることを意味します。 (thisを使って静的変数を参照できるという事実は、Javaの奇妙なものです。)

+2

原則として、コンストラクタ内に静的フィールドを設定しないでください。フィールドを「final」にしてみてください。これは、多くの間違いを避けるのに役立ちます。 –

+0

@Peter:はい、**非常に**良いルールです。しかし、このケースでは、とにかく静的なものにしたくないと思っています。 –

+0

コンストラクタで静的フィールドを設定しているのを見ると、バグや混乱の原因となっています。 ;) –

0

あなたのnomフィールドとwheeフィールドは静的です。つまり、クラスのオブジェクト(インスタンス)ではなく、クラスに関連付けられていることを意味します。

したがって、this.nomに新しい値を割り当てると、実際にはCar.nomに値が割り当てられます。コンパイラはオブジェクトを通して静的変数を参照することができますが、それは非常に悪い習慣です。静的なフィールドは常にそのクラスで参照する必要があります:Car.nom、Car.whee。これにより、nomとwheeは静的であり、クラスのすべてのインスタンスで共有されることが明らかになります。この場合、これらのフィールドは静的であってはなりません。それぞれのCarインスタンスには独自の名前とそれがあるかもしれません。

0

コードを構造化するより良い方法は、次のとおりです。

class Car { 
    private final int nom; 
    private final String whee; 
    public Car(int nom, String whee) { 
     this.nom = nom; 
     this.whee = whee; 
    } 
    public String toString() { return num + " " + whee; } 
} 

class Rawr { 
    private final Car[] jar = {new Car(2, "yar"), new Car(3, "tar"), new Car(4, "sars")}; 
    public String toString() { 
     return Arrays.toString(jar); 
    } 
} 
関連する問題