这是情况。假设我们有两个独立的对象类型,我们希望它们中的每一个都指向另一个。例如:
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中是否允许这样做?做这样的事情有什么问题吗?
答案 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);
}
}