4

给定以下代码:

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

     }
 }

为什么我的应用程序在实例化过程中崩溃?(根据调试器)它进入某种无限递归。任何想法?

4

5 回答 5

3

因为你有

Classa inner=new Classa()

这相当于

class Classa {
  Classa inner;

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

它不断实例化与包含类相同类型的内部变量,从而创建无限数量的实例。

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

于 2013-05-06T19:57:22.937 回答
2

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

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

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

于 2013-05-06T19:57:32.767 回答
1

您是new Classa()从 Classa 构造函数内部调用的。

于 2013-05-06T19:56:41.590 回答
1

当您尝试构造一个新Classa对象时,实例变量inner作为构造过程的一部分被初始化,这导致了对Classa构造函数的另一个调用,因此代码进入了无休止的递归。

于 2013-05-06T19:57:17.707 回答
1

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

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

static Classa inner = new Classa(){
于 2013-05-06T19:57:24.390 回答