A类样本1
public class A {
private A instance = new A();
public A() {
}
public A getInstance() {
return instance;
}
}
A类样本2
public class A {
private static A instance = new A();
public A() {
}
public static A getInstance() {
return instance;
}
}
主类
public class MainClass {
public static void main(String[] args) {
A a = new A();
}
}
当我尝试使用Class A Sample 1运行上面的程序时,它会抛出stackOverflowError Exception
但是当我尝试使用Class A Sample 2运行时
它运行没有任何错误。有谁可以向我解释一下我使用A类样品1时为什么会抛出错误的详细信息?谢谢。
答案 0 :(得分:4)
private A instance = new A();
public A() {
}
这相当于在构造函数中调用new A()
的代码。它实际上与:
private A instance;
public A() {
this.instance = new A();
}
你看到这是如何导致无限递归的吗?构造函数A()
调用自身。
private static A instance = new A();
另一方面,当你有一个静态变量时,它只在加载类本身时实例化一次,而不是每次创建一个类的实例时。就像你在静态初始化块中完成它一样 - 它只运行一次。
private static A instance;
static {
A.instance = new A();
}
注意this.instance
成为A.instance
的方式。这里只有一个类范围的instance
变量,而另一个版本中只有一个实例副本。
答案 1 :(得分:1)
因为在非static
的情况下,您每次都在调用new A()
创建新的A
...
答案 2 :(得分:1)
Sample 1
导致无限循环,因为每次创建A
实例时,它都会创建另一个A
实例,直到用完堆栈空间为止。由于您在static
中使用Sample 2
,因此成员变量instance
将被创建一次。