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

Mas*_*son 3 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Edw*_*uck 7

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

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

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