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

问题描述:

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

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参考

谁能澄清整个事情??为什么静态引用循环依赖不会发生?

+0

谢谢大家...虽然我意识到静态/非静态的概念..但是现在我明白了......我有点困惑......再次感谢! – 2013-03-26 18:49:31

+0

完成Sotirios! – 2013-03-26 18:53:44

instanceObj是非静态的,对于ObjectTest构造函数创建另一个ObjectTest它创建另一个ObjectTest,等等循环往复。当它是静态的时,整个ObjectTest类只有一个instanceObj创建...它毕竟是静态的,它是。 :)当instanceObj是静态的并且它的ObjectTest被创建时,它已经拥有静态的instanceObj,它本身就是。这确实需要一些习惯,它可能有助于在纸上做到这一点,并确保你清楚static关键字的含义。

因为它在对象内部创建对象,并在对象内部再次创建对象。这就像两个镜子在彼此前面时的无限镜像。

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

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

因为你暴露的代码几乎是一样的:当你修改字段静态字段

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"); 
    } 

} 

执行构造函数只有一次。