2015-12-31 54 views
0

新年快乐的家伙:-) 我需要你的帮助来了解我的错误。子类调用父类递归的Java

我创建板类和细胞类谁扩展板类,并在板I类也有单元的阵列。 当我运行我的代码时,我得到了java.lang.StackOverflowError异常。

板类:

Cell boardGame[][] = new Cell[8][8]; 

public Board() { 
    /* 
    * for (int i = 0; i < board.length; i++) { for (int j = 0; j < 
    * board[i].length; j++) { board[i][j] = "-"; } 
    */ 
    reorder(); 
    printBoard(); 
} 

public void reorder() { 
    for (int i = 0; i < 8; i++) { 
     boardGame[1][i] = new Cell((new Pawn(ChessPiece.PAWN, Color.BLACK)), 1, i); 
     boardGame[6][i] = new Cell((new Pawn(ChessPiece.PAWN, Color.WHITE)), 6, i); 
    } 
{...} 

Cell类:

public Cell(int xPosition, int yPosition) { 
     position = new MoveSet(xPosition, yPosition); 
     color = null; 
     display = null; 
    } 

    public Cell(Soldier soldier, int xPosition, int yPosition) { 
     this(xPosition, yPosition); 
     this.soldier = soldier; 
     setRoleMark(); 
    } 

{...} 

当我试图调试我发现我的电池构造到董事会的构造和运行重新排序()再次,然后创建另一个细胞的构造函数,去给董事会的构造和运行再次重新排序...

我意识到这是一个可怕的设计,因为我的手机类不从董事会CLA需要什么无论如何,但我想明白为什么会发生。 我从来没有叫过超级,所以为什么我的单元类叫板的构造函数?

我的猜测是每个Cell都试图从它的超类创建Cell boardGame[][] = new Cell[8][8](因为子类获得超级变量的权利?),所以它基本上试图创建它自己。

但我不知道,你可以批准它给我吗?

感谢, 或者

+4

以何种方式为'Board'的'Cell'可能是子类?这是你的根本错误。 'Board'是'Cell'对象的容器,但'Cell'不是'Board'的一种类型。 –

+1

如果单元“是”董事会,董事会的构造函数调用重新排序,创建更多的单元格,从beginnig开始无休止地。 – Stefan

回答

1

因为Java调用super()隐含的构造函数的第一个动作,如果你不自己做您收到此错误。

如果构造体不明确的构造函数调用,并正在申报的构造开始不是原始类对象的一部分,然后在构造函数体隐式超类构造函数调用开始“超级();”,它的直接超类的构造函数的调用没有任何参数。

在这里看到完整的参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.5


作为一个侧面说明,从它是一个坏主意旁白有Cell延长Board您可能希望将董事会的一代进入一个静态的工厂方法,并且让他的构造函数非常空。这样你就永远不会碰到这些隐藏的副作用。

+0

所以它自动调用构造函数的超级?有趣。 因为我在子类构造函数中看到很多以super()开头的代码。 如果它没有任何特殊参数,则它毫无意义。 –

+0

这是正确的。 –

1

在java中任何子类建筑必须经过superclas构造函数的调用,如果你不调用超构造函数通过明确的默认构造函数默认构造超爪哇。