gpt4 book ai didi

java - 堆栈溢出java

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:48:22 25 4
gpt4 key购买 nike

对象作为类变量导致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/

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