java - 堆栈溢出java

标签 java static

对象作为类变量导致stackoverflow

public class stack {
        stack obj = new stack();   // its obvious that during class loading obj will call class to
        // load and infinite loop will occur. 
}

假设我在类 obj 中使用 static

public class stack {
      static stack obj = new stack();  // it will not cause infinite loop and program will //execute successfully
}

当类第一次被 JVM 捕获时,静态变量被分配到内存中(据我所知)。 仅当 JVM 开始将内存分配给上述 static 对象变量时才说第一次。它会再次调用该类,这也会导致无限循环。某处我错了。有人可以强调我错在哪里吗。

最佳答案

不,将其声明为static 不会导致无限循环。原因如下。

静态变量在类加载时初始化。因此,当您的类第一次加载时,编译器将为静态变量创建一个实例,仅此而已。这不会导致您的类第二次加载。由于您的类(class)没有再次加载,因此不会重复此过程。

如果您将其声明为非静态属性,那就完全不同了。考虑这个 -

public class stack {
    stack obj = new stack();

    ........
}

这个声明等同于-

public class stack {
   stack obj;

    public stack() {
        obj = new stack();    // implicitly moved here by the compiler
    }

    ........
}

从上一个例子可以很明显地看出为什么这里有一个无限递归。您在其自己的构造函数中创建了 stack 类的一个实例,该实例又创建了另一个实例,然后又创建了另一个......它继续进行,导致 Stack Overflow。

关于java - 堆栈溢出java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18547792/

相关文章:

c - 当非静态函数声明跟在静态函数声明之后会发生什么?

php - PHP 5.3 之前的静态继承

java - AngularJS - 通过 AJAX 下载文件

java - 如何将上下文传递给静态方法?

java - 摘要解析器错误 java.lang.NoSuchMethodException : Employee. <init>()

java - 为什么我不能在 Java 构造函数中声明静态变量?

java - 如何在谷歌地图上显示带有坐标的数组列表?

java - 避免两个 for 循环并将它们合并为一个的更有效方法?

javascript:class.property 与 class.prototype.property 模拟静态属性

c - 为什么函数中的非静态变量被初始化为 0 以及为什么它变成静态的?