2011-11-07 12 views
0

Javaクラスに関するいくつかの問題に直面しています。ここでJavaクラスと名前を挿入するためのループ

私はこの

public static void main(String[] args) { 
    Condutor[] names = new Condutor[10]; 
    Condutor name = new Condutor(); 
    String aName = ""; 

    for (int i = 0; i < 2; i++){ 
     aName = "Mike" + i; 

     name = new Condutor(aName); 
     names[i] = name; 

    } 
    for (int i = 0; i < 10;i++){ 
     System.out.println(names[i]); 
    } 

} 

は、これは、この予想印刷として働いてい私は

public class Condutor { 
    private String name; 

    public Condutor(){ 
      name = ""; 
    } 

    public Condutor(String aName){ 
      this.name = aName; 
    } 

    public void setName(String aName){ 
      name = aName; 
    } 

    public String getName(){ 
      return name; 
    } 

    @Override 
    public String toString(){ 
     return name; 
    } 

} 

とメインに定義されたクラスです。 Mike0 Mike1 ヌル ヌル ヌル はnull null null null ヌル

私はすべてが期待どおりに動作しますループが、名前でそれを見ることができ、同じクラスを維持するが、それは

------ 
    Mike0 
    ------ 
    ------ 
    Mike1 
    ------ 
    Mike1 
    Mike1 
    null 
    null 
    null 
    null 
    null 
    null 
    null 
    null 

を印刷し

 name.setName(aName); 
     names[i] = name; 
     System.out.println("------"); 
     System.out.println(names[i]); 
     System.out.println("------"); 

によって

 name = new Condutor(aName); 
     names[i] = name; 

を変更配列は最初の2つの位置に最後の入力を格納します。

どうしてですか? ループのように正確に保存してはいけませんか?

に関して、唯一Condutorが今までに作成され、それは双方に添加されるので、これが発生

Favolas

答えて

1

あなたも後者の場合には、新しいオブジェクトを作成する必要があります:あなたが最初のループの各反復で別のインスタンスを作成している、あなたの第一のバージョンで

name = new Condutor(); //add this line to make sure you create new object in every iteration 
name.setName(aName); 
names[i] = name; 
System.out.println("------"); 
System.out.println(names[i]); 
System.out.println("------"); 
+0

ありがとうございます。今私はあなたが問題を解決したと言っていることを理解し、やっている – Favolas

3

[0]、[1]の位置。

I = 1の場合

それが両方に反映される名前を変更する[0]、[1]の位置

+0

ありがとうございました。今私は理解する – Favolas

1

第二に、あなたはCondutorの新しいインスタンスを作成していないので。毎回同じインスタンスを使用しています。あなたは

names[i] = name; 

を行うと

Condutor[] names = new Condutor[10]; 
Condutor name = new Condutor(); // this is the one that is being used. 
+0

ありがとう。今私は理解する – Favolas

0

あなたはname下オブジェクトをコピーするていないが、あなたは、単にnames[i]にそれを参照をコピーしています。変更後、mainの2行目に作成されたもの以外のConductorのインスタンスは決して作成されません。 nameは、常に、mainの2行目で作成した同じインスタンスを参照していることにも注意してください。その結果、同じオブジェクトの名前を繰り返し設定すると、

name.setName(aName); 

が繰り返し設定されます。配列の第一及び第二の要素にあなたもコピー参照(オブジェクトではありません):

names[i] = name; 

最終的には、一つだけConductorその名前が最初のループで二回を更新してきたこれがあります)、参照先はnamenames[0]names[1]に格納されています。これは出力を説明します。

+0

ありがとう。今分かります。あなたはそれを簡単に理解できました。 – Favolas

1

を。このようにして、すべての "condutor"は個人名を保持します。

しかし、2番目のバージョンでは、各繰り返しで同じCondutorインスタンス(main()の2行目で作成されたインスタンス)を繰り返し割り当てたり再利用したりして、この1つのオブジェクトの名前のみを変更します。したがって、結果を印刷するときには、この単一のオブジェクトの名前、最後に設定された名前のみが表示されます。

+0

ありがとう。今分かります – Favolas

関連する問題