gpt4 book ai didi

java - 为什么当 getInstance 方法不是静态时抛出 stackOverflowError

转载 作者:行者123 更新时间:2023-12-03 23:01:50 28 4
gpt4 key购买 nike

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();
}

}

当我尝试使用 A 类示例 1 运行上述程序时,它抛出 stackOverflowError Exception 但是当我尝试使用 A 类示例 2 运行时它运行没有任何错误。任何人都可以向我详细解释为什么在我使用 A 类示例 1 时会抛出错误?谢谢。

最佳答案

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();

另一方面,当你有一个静态变量时,它只会在加载类本身时实例化一次,而不是每次创建类的实例时。就好像您是在静态初始化 block 中完成的一样——它只运行一次。

private static A instance;

static {
A.instance = new A();
}

注意 this.instance 是如何变成 A.instance 的。这里只有一个类范围的 instance 变量,而在另一个版本中只有一个实例副本。

关于java - 为什么当 getInstance 方法不是静态时抛出 stackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17518537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com