class Test
{
      public static void main(String[] args) {
            new B();
      }}class A
{
      //A a = new A();       执行这行的话就报错java.lang.StackOverflowError      A()
      {
            System.out.println("aaa");
      }
}
class B extends A
{
      B b = new B();
      B()
      {
            System.out.println("bbb");
      }
}
运行结果是无数个aaaaaaaaaaaaaaaaaaaaaaaa.................死循环了这是为什么如运行//A a = new A();的话就报错java.lang.StackOverflowError

解决方案 »

  1.   

    当然会死循环了A类有一个类型也是A的成员变量a,new A()的时候,就要去实例化它的成员变量a,a = new A(),然后a也有自己的成员变量也要实例化,然后又调用new A()
    如此一直循环到死
      

  2.   

    B继承A,所以new B()分配内存时;会先new A();
    而new B()又会导致b = new B()----->再导致new A();
    这样就死循环了。
    所以StackOverflowError 
    (执行不执行A a = new A();)都会导致StackOverflowError,只是时间问题。
      

  3.   

    无论你加不加//A a = new A(),都会出现StackOverflow的
    因为当你new B()时,JVM会按首先初始化父类A中成员变量,并执行它的构造函数,然后初始化B中的成员变量,当初始化类B中的成员b时,它要求创建一个新的B对象,JVM又重新开始创建对象了,结果就是死循环,
    最后堆栈溢出了至于出现aaaaaaaaaaaaaaaaaaaa是因为在new B()时,初始化父类A的构造函数时,打印出aaa了
      

  4.   

    class A
    {
          //A a = new A();       执行这行的话就报错java.lang.StackOverflowError      A()
          {
                System.out.println("aaa");
          }
    }
    class B extends A
    {
          B b = new B();
          B()
          {
                System.out.println("bbb");
          }
    }
    你为什么在A和B类里面还 new 他们阿
      

  5.   

    A a = new A();  这句你可以房在 class B 中 ,也可以放在
    class Test中 当时不能在 class A中使用...
    另外打印 无数个 aa的话
    就是因为  
    当你new B();
     会 执行到B() 这一句
    然后 B 是 继承 A 的 所以 跑上次打印了个a
    又跑回B 类里 
    执行完
    B b = new B();
    后 又一次 执行到 B()
    然后又一次 跑 上次打印 a
    所以就会又无数个了
      

  6.   


    就是这样的,new B()的时候先返上去调B的父类A,A有个构造函数A(),故执行 System.out.println("aaa");
    然后b实例化,引起无限循环
      

  7.   

    dui 对,不过我对米的话有点不懂。 为什么注释掉这句还是堆栈溢出。。不是只打印2次么??
      

  8.   

    因为你在类B中又包含一个b的成员,这样导致JVM又开始创建一个新的B对象了,这样又因为包含成员b,又开始创建B对象了一直重复直到溢出