Java对象包含彼此

时间:2015-11-14 05:48:06

标签: java reference logic

我有两个对象。

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

1 个答案:

答案 0 :(得分:2)

您正在使用对象,因此您的变量实际上是引用。当您将“parents”指定为child1的父级时,您将保存引用,而不是值,反之亦然。因此,如果您将“parent1”和“child2”的父项设为“parent”,则两者都将引用同一个对象。如果添加后引用,两个子节点仍将“看到”更改,因为您在内存中引用了相同的对象。 我清楚了吗?对不起,我不是母语为英语的人!

修改

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

会变成

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

它会产生你所期望的。

最终推荐。 使用child1.parents == parents代替child1.parents.equals(parents),因为您愿意compare instances of objects(实际上它会有相同的结果,因为您没有覆盖equals方法)。