2013-05-31 4 views
1

Почему это работает так, как это делает ... (контр-интуитивно для меня)Как работают объекты 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; 
    } 

} 

Это неожиданно приводит к «оба объекта» изменяются так, что «int integer» одинаково.

Логически (если моя логика имеет смысл), я бы предположил, что установка одного объекта на равную с другим была бы разовой вещью и что любое изменение в одном из объектов не изменило бы автоматически другое , Есть что-то, чего я не вижу, например, может быть, есть только один объект с двумя ссылками? Или что-то... ?

ответ

3

Возможно, существует действительно только один объект с двумя ссылками?

Да.

Этот код:

obj2 = obj1; 

является ссылкой назначения. Объекты не копируются.

+0

«Объекты не копируются» .. это имеет смысл тогда. Как я могу сделать так, чтобы объект был скопирован? Должен ли я сделать это вручную и создать второй объект? – kukac67

+0

см. Http://en.wikipedia.org/wiki/Clone_(Java_method) – Jason

2

И obj1 и obj2ссылки на тот же объект после выполнения задания. Таким образом, после

obj2 = obj1;

обе ссылки указывают на один и тот же объект; все результаты должны совпадать. Если вы хотите скопировать, вы можете сделать что-то вроде

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

или создать новый конструктор, который принимает экземпляр и создает копию (немного лучше API).

0

Оба объекта указывают на тот же объект памяти, как вы сделали назначение:

obj2 = obj1; 

Не имеет значения, какие изменения вы используете любой из ссылок, то изменение будет сделано для того же объекта памяти ,

0

Когда вы набрали obj2 = obj1; вы в основном сказали, что оба указателя для obj2 и obj1 должны указывать на один и тот же адрес памяти, поэтому на один и тот же объект. Вы должны ввести:

... 
obj1 = new TestObject(); 
obj1.setInt(1); 
obj2 = new TestObject(); 
... 
Смежные вопросы