使用继承的JPanel堆栈OverFlow

时间:2015-02-02 04:49:20

标签: java inheritance jpanel stack-overflow

所以我正在编写一个相当广泛且存在堆栈溢出错误的程序(不,我没有使用任何类型的递归,至少不是直接的。)我试图用更简单的类重新创建这种情况看看它是否也会导致堆栈溢出错误而且确实如此。他们在这里:

头等舱:

public class Thing 
{
    public static void main(String[] args) 
    {
          OtherThing thing = new OtherThing();
    }
}

第二课:

public class OtherThing extends JPanel
 {
     protected int s =5;
     protected String blah = "asfasd";
     public OtherThing()
     {
        OtherOtherThing thing2 = new OtherOtherThing();
     }
 }

最后一堂课:

public class OtherOtherThing extends OtherThing
 {
     public OtherOtherThing()
     {

     }
 }

这会导致堆栈溢出在OtherThing第8行和OtherOtherThing第4行之间反弹(现在确定有点关闭。)

我知道你可以从一个继承自其他东西的类继承,Java API已经充满了它们。这个例子有什么问题?

2 个答案:

答案 0 :(得分:1)

因为创建OtherOtherThing时,会调用其父OtherThing的构造函数,这会创建一个新的OtherOtherThing,并在此OtherOtherThing内,它将依次创建新的OtherOtherThing ...,导致stackoverflow。

您可以使用延迟初始化急切初始化来解决此问题:

延迟初始化:

public class OtherThing extends JPanel
 {
     protected int s =5;
     protected String blah = "asfasd";
     private OtherOtherThing other = null;
     public OtherThing()
     {

     }
     public void initialize(){
          other =  new OtherOtherThing();
     }
 }

急切初始化:

 public class OtherThing extends JPanel
 {
     protected int s =5;
     protected String blah = "asfasd";
     private OtherOtherThing other = new OtherOtherThing();
     public OtherThing()
     {

     }

 }

答案 1 :(得分:0)

  

这个例子有什么问题?

除非另有说明,否则构造函数的第一件事就是调用超类构造函数。

public OtherOtherThing()
{
    super(); // automatically added by compiler
}

所以是的,你的代码将继续创建新的OtherOtherThing,直到堆栈溢出。