2013-05-31 5 views
1

Pourquoi ce travail comme il le fait ... (contre-intuitive pour moi)Comment fonctionnent les objets Java?

Test.java:

public class Test { 

    public TestObject obj1; 
    public TestObject obj2; 

    public Test() { 
     obj1 = new TestObject(); 
     obj1.setInt(1); 
     obj2 = obj1; 
     System.out.println("Should be the same: " + obj1.getInt() + ", " + obj2.getInt()); 
     obj1.setInt(2); 
     System.out.println("Should be different? (2, 1): " + obj1.getInt() + ", " + obj2.getInt()); 
     obj2.setInt(3); 
     System.out.println("Should be different? (2, 3): " + obj1.getInt() + ", " + obj2.getInt()); 
    } 

    public static void main(String[] args) { 
     new Test(); 
    } 

} 

TestObject.java

public class TestObject { 

    int integer; 

    public void setInt(int n) { 
     integer = n; 
    } 

    public int getInt() { 
     return integer; 
    } 

} 

Ceci, dans des résultats étonnamment les "deux objets" changent de sorte que "int integer" soit le même. Logiquement (si ma logique a un sens), je suppose que régler un objet pour qu'il soit égal à un autre serait une chose unique, et que tout changement dans l'un des objets ne changerait pas automatiquement l'autre . Y at-il quelque chose qui me manque, comme peut-être il n'y a vraiment qu'un seul objet avec deux références? Ou quelque chose... ?

Répondre

3

peut-être qu'il n'y a vraiment qu'un seul objet avec deux références?

Oui.

Ce code:

obj2 = obj1; 

est une affectation de référence. Aucun objet n'est copié.

+0

« Aucun objet copiés » .. qui fait sens alors. Comment ferais-je en sorte qu'un objet soit copié? Dois-je le faire manuellement et créer un second objet? – kukac67

+0

voir http://en.wikipedia.org/wiki/Clone_(Java_method) – Jason

2

Les deux obj1 et obj2 sont références au même objet après l'affectation. Ainsi, après

obj2 = obj1;

les deux références pointent vers le même objet; tous les résultats devraient correspondre. Si vous souhaitez copier, vous pouvez faire quelque chose comme

obj2 = new TestObject(obj1.getInt());

ou créez un nouveau constructeur qui prend une instance et crée une copie (un peu plus agréable API).

0

Les deux objets pointent vers le même objet de mémoire que vous avez fait la mission:

obj2 = obj1; 

question non ce que vous modifiez n'utilisant des références, le changement se fera au même objet de mémoire .

0

Lorsque vous avez tapé obj2 = obj1; vous avez essentiellement dit que les deux pointeurs pour obj2 et obj1 doivent pointer vers la même adresse mémoire, par conséquent, sur le même objet. Vous devez taper:

... 
obj1 = new TestObject(); 
obj1.setInt(1); 
obj2 = new TestObject(); 
... 
Questions connexes