子类调用父类递归java

时间:2015-12-31 20:21:33

标签: java class exception stack-overflow

新年快乐的家伙:-) 我需要你的帮助来理解我的错误。

我创建了扩展板类的板级和单元类,在板级中我也有一组单元格。 当我运行我的代码时,我得到了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);
    } 
{...}

细胞类:

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

{...}

当我尝试调试时,我注意到我的Cell构造函数转到Board构造函数并再次运行reorder(),然后它创建另一个Cell构造函数,转到Board构造函数并再次运行重新排序...

我意识到这是一个糟糕的设计因为我的Cell课程无论如何都不需要董事会课程,但我想知道为什么会这样。 我从来没有打过super,为什么我的单元类会调用board构造函数?

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

但我不确定,你能批准我吗?

谢谢, 或者

2 个答案:

答案 0 :(得分:1)

您收到此错误是因为Java会隐式调用X <- G[,-c(1,2,3,5)]; X$Price <- log(X$Price)作为构造函数的第一个操作,如果您自己不这样做的话。

  

如果构造函数体不是以显式构造函数调用开始并且声明的构造函数不是原始类Object的一部分,那么构造函数体隐式地以超类构造函数调用开始&#34; super();&# 34;,调用其直接超类的构造函数,不带参数。

请参阅此处以获取完整参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.5

作为旁注,除了Time扩展super()之外,您可能希望将您的一代电路板移动到静态工厂方法并留下{{1}。 1}}构造函数几乎是空的。这样你就不会遇到这些隐藏的副作用。

答案 1 :(得分:1)

在java中,任何子类构造都必须在superclas构造函数调用之后,如果你没有显式地调用超级构造函数,那么java默认情况下通过默认构造函数构造超类。