Java中的两个对象可以相互包含吗?

时间:2012-02-21 01:40:56

标签: java oop object

这是情况。假设我们有两个独立的对象类型,我们希望它们中的每一个都指向另一个。例如:

public class Object1
{
    Object2 obj2;

    public Object1(Object2 obj)
    {
        obj2 = obj;
    }
}

public class Object2
{
    Object1 obj1;

    public Object2()
    {
        obj1 = null;
    }

    public void setObject1(Object1 obj)
    {
        this.obj1 = obj;
    }
}

public class Tester
{
    public static void main(String[] args)
    {
        Object2 obj2 = new Object2();
        Object1 obj1 = new Object1(obj2);
        obj2.setObject1(obj1);
    }
}

Java中是否允许这样做?做这样的事情有什么问题吗?

4 个答案:

答案 0 :(得分:7)

是的,它在Java中是允许的。编译器以与C / C ++编译器略有不同的方式跟踪依赖关系,因此当它检测到您编译的Object1需要使用非编译版本的Object2时,它也会编译Object2。

就此上下文中“包含”的含义而言,从技术上讲,两个对象都不包含另一个,它们都包含对另一个的引用。也就是说,对包含引用的对象没有限制(无论多么循环)。

有趣的是,垃圾收集器还可以很好地处理循环引用,因此如果创建了一个断开的引用对象圈,它们将在大致相同的时间收集垃圾。通过引用计数工作的旧垃圾收集技术可能会被循环引用所欺骗,但Java使用可达性算法来确定是否可以从主程序线程访问这些对象。

答案 1 :(得分:3)

没有问题。允许骑自行车。你应该编译和检查而不是问一个问题; - )。

答案 2 :(得分:1)

是的,Java中允许循环依赖,这是处理它们的正确方法。

答案 3 :(得分:0)

正如James和Pangea所说,只要自己尝试一下,你就可以学到很多东西。例如,您认为在这种有趣的情况下会发生什么?

class Class1 {
    public static final String name = Class2.name;
}

class Class2 {
    public static final String name = Class1.name;
}

class CircularTest {

    public static void main(String[] args) {
        System.out.println(Class1.name);
    }
}