2017-09-14 4 views
-1

J'ai essayé de cloner l'objet de Test2 en utilisant la méthode "KUROONN". Je m'attendais à ce que la deuxième ligne de la sortie lise [0,0], mais le résultat réel montre [33,4]. Je ne sais pas pourquoi cela arrive, alors quelqu'un peut-il expliquer cela?JAVA il ne clone pas bien

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(); 
    } 
} 

La sortie du programme est:

[] 
[33, 4] 
+0

Pourquoi attendez-vous la sortie [0,0]? Vous ne mettez jamais cela aussi loin que je vois. De plus, n'utilisez pas Test, Test2 comme nom de classe, puis nommez les variables Test2Int. Même si le code est relativly simple, il est assez difficile à comprendre. Et l'ArrayList en classe Test statique pour une raison spécifique? Parce que sinon je supprimerais cette chose en premier. –

+0

Désolé pour mon erreur. Je voulais dire que je m'attendais []. Et ce code était censé être juste un test de débogage pour un plus gros code que je fais, alors j'ai juste utilisé des tests pour les noms. Vraiment désolé. –

Répondre

0

Vous avez déclaré le champ T comme:

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

Le mot static signifie que la variable est partagée entre toutes les instances. Ainsi, lorsque le code

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

est exécuté, il va créer une instance de Test2 que les références que variables partagées. La première fois, il sera vide, et votre impression se traduira par []. La deuxième fois il se référera à la même liste dans lequel le premier appel a ajouté les valeurs 33 et 4, d'où il va imprimer [33, 4]. Après cela, les valeurs 114 et 514 seront également ajoutées à la même liste.

+0

Oh oui ... Je n'ai tout simplement pas compris ce que signifie "statique". –