这是情况.假设我们有两个独立的对象类型,我们希望它们中的每一个都指向另一个.例如:
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允许的吗?做这样的事情有什么问题吗?
是的,它在Java中是允许的.编译器以与C/C++编译器略有不同的方式跟踪依赖关系,因此当它检测到您编译的Object1需要使用非编译版本的Object2时,它也将编译Object2.
至于在此上下文中"包含"的含义,从技术上讲,两个对象都不包含另一个,它们都包含对另一个的引用.也就是说,对包含引用的对象没有限制(无论多么循环).
有趣的是,垃圾收集器也很好地处理循环引用,因此如果创建了一个断开的引用对象圈,它们将在大致相同的时间收集垃圾.通过引用计数工作的旧垃圾收集技术可能被循环引用所欺骗,但Java使用可达性算法来确定是否可以从主程序线程访问对象.