2015-12-31 34 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構造函數的調用,如果你不調用超構造函數通過明確的默認構造函數默認構造超爪哇。