当前位置: 首页 > 知识库问答 >
问题:

为什么这个实例变量为同一类的类会导致StackOverflowerr错误,而具有相同类型静态变量的类似类则不会?[重复]

艾星河
2023-03-14

我的问题与另一个问题有关:在类本身内部创建类的实例是如何工作的?

我创建了两个类,如下所示:

class Test {
  Test buggy = new Test();
  public static void main (String[] args) {
    Test test = new Test();
    System.out.println("Done");
  }
}

还有一个:

class Test {
  static Test buggy = new Test();
  public static void main (String[] args) {
    Test test = new Test();
    System.out.println("Done");
  }
}

我不明白为什么第一个代码(没有静态变量)会出现堆栈溢出错误,但当我将实例变量声明为静态(第二种情况)时,没有出现错误。这里的static关键字有什么区别?

共有2个答案

上官华池
2023-03-14

静态字段仅在测试类首次由类加载器加载时初始化一次。

公良鸿畅
2023-03-14

无论何时创建类的新实例,第一个代码段都会创建测试类的新实例。因此出现了无限递归和堆栈溢出。

Test test = new Test(); // creates an instance of Test which triggers
                        // initialization of all the instance variables,
                        // so Test buggy = new Test(); creates a second
                        // instance of your class, and initializes its
                        // instance variables, and so on...

第二个代码段,因为这里的变量是静态的,所以在初始化类时会创建类的实例。创建类的新实例时,没有无限递归。

Test test = new Test(); // this time buggy is not an instance variable, so it
                        // has already been initialized once, and wouldn't be
                        // initialized again
 类似资料:
  • 我有两个接近1000大小的整数向量,我要做的是检查这两个向量的平方整数和是否相同。所以我编写以下代码:

  • 问题内容: 我在这里已经读到,在Java中,具有相同名称但不同类型的两个变量可以在同一范围内共存。我的意思是这个 但是所有的Java IDE都不允许这样的代码。我想知道这样的代码在语法上是否正确,或者只是IDE不允许这样的代码防止歧义。 无论如何,这是网站的摘录 “如果幸运的话,您也许能够重新编译Jad的输出。 但是,Java VM对于变量命名的规则比Java语言本身更为宽松。例如,一个有效的类文

  • 但所有java IDE都不允许这样的代码。我想知道这样的代码在语法上是否真的正确,或者只是IDE不允许这样的代码来防止歧义。 总之,这里是从网站上摘录的 “如果你幸运的话,你也许可以重新编译JAD的输出。然而,Java VM对变量命名的规则比Java语言本身更宽松。例如,一个有效的类文件可以有几个名为'a'的变量,只要它们有不同的类型。如果你反编译这样的类,你得到的源代码将是无效的。 JAD通常会

  • 问题内容: 我已经在Google上进行了广泛的搜索,但均无济于事。我似乎无法将这个概念笼罩在脑海中。为什么本地班级会接受静态最终字段?如下面的以下示例: 在EnglishGoodbye课堂上,允许告别可变吗?为什么?我很困惑。为什么允许但没有静态变量?我知道为什么它不能访问封闭范围的成员,除非它们是一个编译器时间常数,因为当函数结束时这些变量不再存在,但类可能不存在。对?我只是对此感到困惑。 谢谢

  • 问题内容: 在下面的Java示例中,谁能确切解释为什么程序输出为“ Orange”?(这是一个面试问题) 问题答案: 变量Y掩盖了类型Y。请参见JLS: 6.4.2。遮盖 简单名称可能出现在可能被解释为变量,类型或包的名称的上下文中。在这些情况下,第6.5节的规则指定将优先于类型选择变量,并优先于包选择类型。因此,有时可能无法通过其简单名称引用可见类型或程序包声明。我们说这样的声明是模糊的。 合格