为什么在同一个类的实例中创建非静态实例时会发生堆栈溢出错误?
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 :(得分: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");
}
}
只执行一次构造函数。