-2

为什么在同一类的实例中创建非静态实例时会发生堆栈溢出错误?

public class ObjectTest {
    ObjectTest instanceObj = new ObjectTest("Outside");

    public ObjectTest(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }
}

但问题通过以下修改得到解决:

static ObjectTest instanceObj = new ObjectTest("Outside");

据了解,循环依赖在第一种情况下发生,同时将新对象分配给instanceObj引用

任何人都可以澄清整个事情吗?为什么静态引用不会发生循环依赖??

4

3 回答 3

6

instanceObj是非静态的,构造函数ObjectTest创建另一个ObjectTest创建另一个ObjectTest,依此类推。当它是静态的时,只instanceObj为整个ObjectTest类创建一个……毕竟它是静态的。:) 当 instanceObj 是静态的并且它ObjectTest被创建时,它已经拥有静态的 instanceObj,它就是它自己。这确实需要一些时间来适应,这可能有助于在纸上解决它并确保您清楚static关键字的含义。

于 2013-03-26T18:38:14.937 回答
2

因为它在对象内部创建对象,并在对象内部创建对象。当两个镜子保持在对方面前时,这就像无限的镜像。

关于静态对象,它不是类的实例。静态对象是在类级别创建的。

我们在设计 SingleTon 类时使用了同一个类的这样的静态对象。

于 2013-03-26T18:38:26.290 回答
1

因为你暴露的代码几乎是一样的:

public class ObjectTest {
    ObjectTest instanceObj;

    public ObjectTest(String s) {
        instanceObj = new ObjectTest("Outside"); // creating another object executing this constructor again
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }

}

当您将字段修改为静态字段时,您可以执行以下操作:

public class ObjectTest {
    static ObjectTest instanceObj;

    static {
        instanceObj = new ObjectTest("Outside");
    }    

    public ObjectTest(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {
        ObjectTest localObj = new ObjectTest("Inside");
    }

}

只执行一次构造函数。

于 2013-03-26T18:44:42.650 回答