2017-10-07 32 views
1

私はゲームと呼ばれる1つのスーパークラスを持っています。それは次のようになります。スーパークラス(Java)に利用可能なコンストラクタがありません

import java.util.ArrayList; 

public class Game { 
    private ArrayList<Enemy> enemies = new ArrayList<Enemy>(); 
    private ArrayList<Tower> towers = new ArrayList<Tower>(); 
    private int corridorLength; 
    private int currentPosition = 0; 
    public Game(int corridorLength){ 
     this.corridorLength = corridorLength; 
    } 

    public void addTower(int damage,int timeStep){ 
     this.towers.add(new Tower(damage,timeStep)); // Add tower with 
current position corrdor length 

    } 
    public void addEnemy(int health, int speed){ 
     this.enemies.add(new Enemy(health,speed)); 
    } 
    public void advance(){ 
     this.currentPosition = this.currentPosition + 1; 
     if(this.currentPosition == this.corridorLength){ 
      System.out.println("Game Over"); 
     } 
    } 
    public void printDamage(){ 
     System.out.println(this.towers.get(this.currentPosition)); 
    } 

} 

主な焦点は、公共のボイドaddTower(int型、int型) だから、私はタワーと呼ばれるサブクラス持っている上にある:と呼ばれる

public class Tower extends Game { 

    public Tower(int damage, int timeStep){ 
     super.addTower(damage,timeStep); 
    } 
    public void getDamage(){ 
     super.printDamage(); 
    } 
} 

タワーサブクラスのサブクラスをカタパルト:

public class Catapult extends Tower { 
    public Catapult(){ 
     super(5,3); 
    } 

} 

私はJavaを使い慣れていません。ここで間違っているのは分かりません。ゲームのタワーにデフォルトのコンストラクタが必要なのはなぜですか?

+0

'public game(int corridorLength)'がパラメータ化された –

+0

の重複を持つ場合は、明示的なデフォルトのコンストラクタが必要です:https://stackoverflow.com/questions/1197634/java-error-implicit-super-constructor -is-undefined-for-default-constructor –

+0

Towerコンストラクタは、存在しないGameデフォルトコンストラクタを暗黙的に呼び出します。しかし、Towerは本当にGameを拡張する必要がありますか?私は必要がないと思う。それはそれ自身で立つことができないのですか? – DodgyCodeException

答えて

1

デフォルトのコンストラクタをGameクラスに明示的に宣言する必要があります。

public Game(){} 

ので、その時にObjectクラスにチェーンObjectインスタンス化は、それはそのスーパークラスのコンストラクタを呼び出します。 Gameにarg-constructorを明示的に宣言しているため、デフォルトコンストラクタは自動的に追加されません。

+0

私はデフォルトのコンストラクタを追加しましたが、現在、スレッド "main" java.lang.StackOverflowError **の例外**例外が発生します。それは、** super.addTower(int、int)**のタワー内の行と** this.towers.add ... **のゲームクラス –

+0

@AbylIkhsanovの行のために間違っていると言います。あなたのコードを注意深く見てください。次に、super.addTowerを呼び出すとわかります。それは無限ループに入ります。それが原因でエラーが発生しています – Ravi

+0

super.addTowerを呼び出すと、GameクラスのこのメソッドはTower(int、int)コンストラクタを再度呼び出し、互いに呼び出し続けても永遠に続く? –