为什么在实例中创建非静态实例时发生堆栈溢出错误?
问题描述:
为什么在同一类的实例中创建非静态实例时发生堆栈溢出错误?为什么在实例中创建非静态实例时发生堆栈溢出错误?
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
参考
谁能澄清整个事情??为什么静态引用循环依赖不会发生?
答
当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");
}
}
执行构造函数只有一次。
谢谢大家...虽然我意识到静态/非静态的概念..但是现在我明白了......我有点困惑......再次感谢! – 2013-03-26 18:49:31
完成Sotirios! – 2013-03-26 18:53:44