2017-09-14 8 views
-1

「クーロン」メソッドを使ってTest2のオブジェクトをクローンしました。私は出力の2行目が[0,0]を読むと予想しましたが、実際の結果は[33,4]と表示されます。なぜこのようなことが起こるのかわからないので、誰もがこれを説明できますか?JAVAはうまくクローンしません

import java.util.ArrayList; 

class Test { 
    public static ArrayList<Integer> T=new ArrayList<Integer>(); 
} 

class Test2 { 
    int Test2Int; 
    ArrayList<Integer> Test2List; 
    public Test2(int K,ArrayList<Integer> A) { 
     this.Test2Int=K; 
     this.Test2List=A; 
    } 
    public Test2 KUROONN() { //broken clone 
     Test2 b=new Test2(0,Test.T); 
     b.Test2Int=this.Test2Int; 
     System.out.println(b.Test2List); 
     for(int i=0;i<this.Test2List.size();i++) { 
      b.Test2List.add(this.Test2List.get(i)); 
     } 
     return b; 
    } 

} 

public class testtube001a { 
    public static void main (String args[]){ 
     ArrayList<Integer> n =new ArrayList<Integer>(); 
     n.add(33); 
     n.add(4); 
     ArrayList<Integer> m =new ArrayList<Integer>(); 
     m.add(114); 
     m.add(514); 
     Test2 t2_1=new Test2(72,n); 
     Test2 t2_2=new Test2(1919,m); 
     t2_1.KUROONN(); 
     t2_2.KUROONN(); 
    } 
} 

プログラムの出力は次のようになります。

public static ArrayList<Integer> T=new ArrayList<Integer>(); 

言葉staticは、変数はすべてのインスタンス間で共有されることを意味:

[] 
[33, 4] 
+0

出力[0,0]はなぜ期待しますか?あなたは私が見る限りそれを決して決して決してしません。また、Test、Test2をクラス名として使用しないで、Test2Int変数に名前を付けてください。コードは比較的単純ですが、理解するのはかなり難しいです。そして、特定の理由でTestクラスのstaticのArrayListは静的ですか?もしそうでなければ、私はそのことをまず取り除くでしょう。 –

+0

私の間違い申し訳ありません。私は期待したことを意味した[]。そして、このコードは私が作っているより大きいコードのためのちょうどデバッグテストであると考えられていたので、私はちょうど名前のテストを使いました。本当にごめんなさい。 –

答えて

0

あなたはとTフィールドを宣言しました。コード

Test2 b=new Test2(0,Test.T); 

が実行されると、その共有変数を参照するTest2のインスタンスが作成されます。初めて空になると、プリントは[]になります。 2回目は同じリストを参照し、最初の呼び出しで値33と4が追加されたため、[33, 4]が印刷されます。その後、値114と514も同じリストに追加されます。

+0

ああ、はい...私はちょうど静的な意味を理解していませんでした。 –

関連する問題