为什么以下Java代码中存在StackOverflowError?

时间:2013-05-06 19:54:51

标签: java

给出以下代码:

 public class Classa {

     int x=10;

     void func(){

     }

     Classa inner=new Classa(){
         void func(){
                 x=90;
         }

     };

     public static void main(String[] args) {
         Classa c=new Classa();
         c.inner.func();

     }
 }

为什么我的应用在实例化期间崩溃了? (考虑调试器) 它进入某种无限的递归。有什么想法吗?

5 个答案:

答案 0 :(得分:3)

因为你有

Classa inner=new Classa()

相当于

class Classa {
  Classa inner;

  Classa() {
    inner = new Classa();
  }
}

保持实例化一个与包含类相同类型的内部变量,从而创建无限量的实例。

要初始化Classa实例,您需要分配Classa类型的内部变量,这里是无限递归。

答案 1 :(得分:2)

您正在调用新的Classa()。这会触发要构造的类。

现在想一想,inner变量如何实例化?在构造函数调用中,它递归调用inner = new Classa()

那么现在该通话会发生什么?递归重复该过程,直到您的堆栈溢出

答案 2 :(得分:1)

您正在从Classa构造函数中调用new Classa()

答案 3 :(得分:1)

当您尝试构造新的Classa对象时,实例变量inner会在构造过程中被初始化,从而导致对Classa构造函数的另一次调用,因此代码进入无休止的递归。

答案 4 :(得分:1)

您有一个在您的班级中定义的实例变量inner。您正在将其初始化为Classa的匿名子类。这将创建另一个Classa实例。但是这个新实例将尝试创建自己的inner,从而导致无限循环调用创建Classa的实例。每次调用都会将事物放在堆栈上,最终会产生StackOverflowError个结果。

阻止它的一种方法是制作inner static,因此整个班级只有一个inner

static Classa inner = new Classa(){