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

时间:2013-03-26 18:36:20

标签: java stack-overflow

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

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引用

时,第一种情况会发生循环依赖

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

3 个答案:

答案 0 :(得分:6)

instanceObj是非静态时,ObjectTest的构造函数会创建另一个ObjectTest,从而创建另一个ObjectTest,依此类推 ad infinitum 。当它是静态的时,只为整个instanceObj类创建一个ObjectTest ...毕竟, 是静态的。 :)当instanceObj是静态的并且创建了它的ObjectTest时,它已经有静态的instanceObj,它本身就是。它需要一些时间来习惯,它可能有助于在纸上完成,并确保您清楚static关键字的含义。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分: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");
    }

}

只执行一次构造函数。