2015-11-14 85 views
1

我有兩個對象。Java對象包含對方

Child.java

public class Child { 
    Parents parents; 
} 

Parents.java

public class Parents { 
    ArrayList<Child> children = new ArrayList<Child>(); 
} 

我希望他們有彼此。例如:

Foo.java

public class Foo { 
    public static void main(String[] args) { 
     Child child1 = new Child(); 
     Child child2 = new Child(); 
     ArrayList<Child> children_list= new ArrayList<Child>(); 
     children_list.add(child1).add(child2); 
     Parents parents = new Parents(); 

     for (Child child : children_list) { 
      // ... 
      // Bind them together 
      // ... 
     } 
     child1.parents.equals(parents); // true 
     child2.parents.equals(parents); // true 
     // And parents.children is a list containing child1 and child2 
    } 
} 

但是經過多番思考,我來到了,他們似乎無法擁有對方在同一時間的問題。兩個孩子中的一個會有一個年長的父母。

parents.children.add(child); 
child.parents = parents; 
parents.children.set(parents.children.size() - 1, child); 

這將導致child2.parent.children不具有child1

回答

2

您正在使用對象,因此您的變量實際上是引用。當您將「父母」指定爲child1的父母時,您保存的是引用,而不是值,反之亦然。因此,如果您製作「父母」,則「child1」和「child2」的父母都將引用同一個對象。如果你添加後面的引用,兩個孩子仍然會「看到」更改,因爲你引用了內存中的相同對象。 我很清楚嗎?我不是英語母語的人,對不起!

編輯

// ... 
// Bind them together 
// ... 

將成爲

parents.children.add(child); 
child.parents = parents; 

,它會使你的期望。

最後的推薦。 使用child1.parents == parents而不是child1.parents.equals(parents),因爲你願意compare instances of objects(實際上它會有相同的結果,因爲你沒有重寫equals方法)。

+0

對不起,我真的不明白你想說什麼。也許包含一些代碼?換句話說,你的意思是我只需要將相應的引用添加到'child1'和'child2'? –