1

私は以下のコードを開発していました...

class P {
    //public P(){}
    public P(int i) {

    }
}

class D extends P {
    public D(){ // default constructor must be defined in super class

    }
}

public class agf {      
    public static void main(String[] args) {

    }
}

これで、クラスpで明示的なパラメーター化されたコンストラクターが定義され、クラスDでデフォルトのコンストラクターが定義されましたが、それでもコンパイル時エラーが表示されます。説明してください

4

4 に答える 4

7

親クラスPはコンストラクターを明示的に定義しているため、引数なしのコンストラクターは自動的に追加されません。以下に説明するように、superキーワードを使用してクラスPの特定のコンストラクター呼び出しを行わずに、クラスDの引数なしのコンストラクターを作成すると、

Class D extends P {
    public D() {
        super(10);        
    }
}

Pの引数なしコンストラクターを呼び出すように指示しています。Pには定義したコンストラクターしかないため、Pの引数なしコンストラクターを呼び出すことはできません。

簡単に言えば、DのすべてのオブジェクトはPの一部を持ちます。しかし、引数のないコンストラクターがないため、そのPの部分を初期化/構築する方法がわかりません。

于 2012-04-29T04:56:23.023 に答える
1

このコンストラクターの内部:

public D()
{ 
    // no call to super?? implicit call to super()
}

スーパークラスの空のコンストラクター(あなたの場合には存在しません)への暗黙の呼び出しがあります

スーパークラスに空のコンストラクターを実装するか、パラメーター化されたコンストラクターを明示的に呼び出します。例:

public D()
{ 
    super(1);
}

このチュートリアルも読むことをお勧めします。

于 2012-04-29T04:56:29.203 に答える
1

サブクラスでは、スーパークラスコンストラクターを明示的に呼び出さない場合、VMが呼び出すことができるデフォルトのスーパークラスコンストラクターが存在する必要があります。

スーパークラスでは、コンストラクターを明示的に定義すると、デフォルトの引数なしのコンストラクターはコンパイラーによって生成されません。

したがって、表示されている状況では、スーパークラスでデフォルト以外のコンストラクターを定義しました。これにより、コンパイラーはデフォルトの引数なしコンストラクターを生成できませんでした。次に、サブクラスで、スーパークラスのコンストラクターを明示的に呼び出さなかった。コンパイラーは、引数なしのスーパークラスコンストラクター呼び出しを生成しようとしましたが、呼び出すのに適したコンストラクターが見つかりませんでした。

于 2012-04-29T04:56:34.517 に答える
0

クラスDのインスタンスを作成するとき、最初にPのコンストラクターが呼び出されます(DもPであるため)。問題は、Pのコンストラクターに値を指定する必要があるため、Pのコンストラクターを呼び出すことができないことです。これは、現在行っていないことです。これを修正するには、Dのコンストラクターの最初の行をsuper(value)にする必要がありますが、valueは、Dのコンストラクターに送信されるパラメーター、またはその他の必要なもの(Dのコンストラクターをデフォルトのままにする場合)にすることができます。

デバッグで段階的に実行でき、問題を解決するのに役立ちます。

于 2012-04-29T05:03:03.217 に答える