2

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 时会引发错误?谢谢你。

4

3 回答 3

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与其他版本中的每个实例副本相比,这里只有一个类范围的变量。

于 2013-07-08T02:54:23.143 回答
1

Because in the non-static case, you're invoking new A() every time a new A is created...

于 2013-07-08T02:48:55.497 回答
1

Sample 1 causes an infinite loop since every time you create an instance of A it will create another instance of A until you run out of stack space. Since you use static in Sample 2 the member variable instance will be created once.

于 2013-07-08T02:49:12.613 回答