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

在Java中,两个对象可以互相包含吗?,java,oop,object,Java,Oop,Object,情况是这样的。假设我们有两个独立的对象类型,我们希望它们都指向另一个。例如: public class Object1 { Object2 obj2; public Object1(Object2 obj) { obj2 = obj; } } public class Object2 { Object1 obj1; public Object2() { obj1 = null; } p

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

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允许这样做吗?这样做有什么问题吗?

没有问题。允许循环。您应该只是编译和检查,而不是问问题;-)

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

是的,它在Java中是允许的。编译器以与C/C++编译器稍有不同的方式跟踪依赖关系,因此当它检测到编译了Objt1时需要使用Objt2的非编译版本时,它也将编译Objt2.2/P> 就“包含”在本上下文中的含义而言,从技术上讲,两个对象都不包含另一个,它们都包含对另一个的引用。这就是说,对包含引用的对象没有限制(无论多么循环)


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

正如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);
    }
}

你试过了吗?它应该很好用。这很有趣,埃德温。我做了一些进一步的研究,发现虽然这些对象将从“活动线程”中变得“无法访问”,但它们可能不会被“无限期”收集。请参阅此处的更多信息:该文档已有10年以上的历史,因此希望Edwin是正确的,并且已在较新版本中修复。收集之前的时间仍然是不确定的,但它肯定会在出现内存不足错误之前发生。因此,这从来都不是问题——JVM将在需要时回收空间。@TravisJ不确定的时间不是错误,而是允许在垃圾收集实现中具有灵活性。如果他们指定了确切的时间量,繁忙的Java程序可能会不必要地暂停以进行垃圾收集。通过指定不确定的时间量,精心设计的JVM可以选择在垃圾收集对正在运行的程序影响较小的时间安排垃圾收集。自从我开始使用JVM以来,至少想到了四种不同的JVM垃圾收集方案。最新的是“垃圾优先”收集器(也称为G1)。