当getInstance方法不是静态时,为什么它会抛出stackOverflowError

时间:2013-07-08 02:47:33

标签: java class oop static-methods

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时为什么会抛出错误的详细信息?谢谢。

3 个答案:

答案 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将被创建一次。