1

ベイツとシエラ より:

class Top {
    public Top(String s) {
        System.out.print("B");
    }
}

public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.print("D");
    }

    public static void main(String[] args) {
        new Bottom2("C");
        System.out.println(" ");
    }
}

選択肢は次のとおりです。

A.BD

B. DB

C.BDC

D. DBC

E. コンパイルが失敗する

答え:

® ✓ えは正解です。Top には引数のないコンストラクターがないため、Bottom2 のコンストラクターでの暗黙の super() 呼び出しを満たすことができません。クラスに明示的に定義されたコンストラクターがない場合にのみ、デフォルトの引数のないコンストラクターがコンパイラーによって生成されます。

しかし、私は混乱しています。public Top(String s) { System.out.print("B"); ではありませんか? 明示的に定義されたコンストラクター? どこが間違っていますか?

ここでこの質問を見たことがありますが、答えがよくわかりませんでした。

4

5 に答える 5

2

暗黙的な呼び出しは、パラメーターなしで呼び出しsuperを試みます。Topには引数なしのコンストラクタがないため、へのsuper呼び出しは存在しないメソッドを呼び出そうとしています。引数なしでないコンストラクターを呼び出したい場合は、明示的に行う必要があります。Bottom2のコンストラクターは、の 1 引数のコンストラクターを呼び出すsuper(s)ために呼び出す必要があります。Top

于 2013-10-25T01:36:15.087 に答える
1

はい、このコンストラクターは基本クラスで定義されています。ただし、サブクラスからも呼び出す必要があります。

すべてのサブクラス コンストラクターで、基本クラス コンストラクターを呼び出す必要があります。唯一の例外は、引数のない基本クラスのコンストラクターがある場合です。このコンストラクターはデフォルトで呼び出されます。

つまり、コードは次のようになります。

public Bottom2(String s) {
    super(s);
    // ...
}

Top()別の方法として、基本クラスにコンストラクターを追加することもできます。

于 2013-10-25T01:38:25.287 に答える
0

パラメーター化された独自のコンストラクターを作成すると、引数なしのコンストラクターを自分で再度定義しない 限り、Java によって提供されるデフォルトのコンストラクターが置き換えられます。

現在、 にTopはパラメーター化されたコンストラクターがあり、明示的に定義しない限り、デフォルトの引数のないコンストラクターはなくなりました。したがって、電話super()をかけるだけでは機能しません。String引数を渡して を呼び出す必要がありますsuper(string)

のデフォルトのコンストラクターを作成してから、クラスTopを呼び出してみてください。そのエラーは点滅しません=) super()Bottom

これを試して:

class Top {
    public Top() { System.out.println("No-arg constructor in Top"); }
    public Top(String s) {
        System.out.print("B");
    }
}

public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.print("D");
    }

    public static void main(String[] args) {
        new Bottom2("C");
        System.out.println(" ");
    }
}
于 2013-10-25T01:37:49.850 に答える
0

解決策1.新しいBottom2()である基本クラスのオブジェクトを作成し、引数を「C」の文字列として渡し、呼び出しに従って、Bottom2(String s)コンストラクターにgetを呼び出し、「D」を出力します。

2.同時に Bottom2() は Top クラスを拡張するため、「B」は出力する必要がありますが、Top(String s) コンストラクターはパラメーターとして文字列を持ち、メイン クラスには Top(String s) コンストラクターに渡すパラメーターはありません。

3.コンパイラがエラーを出す理由

4.この問題の解決策を以下に示します

    class Top {
    public Top() {
        System.out.println("B");
    }
}
public class Bottom2 extends Top {
    public Bottom2(String s) {
        System.out.println("D");
    }
public static void main(String args[]) {
        new Bottom2("C");
        System.out.println(" ");
    }
}
于 2015-08-02T04:33:12.610 に答える
0

しかし、私は混乱しています。public Top(String s) { System.out.print("B"); ではありませんか? 明示的に定義されたコンストラクター? どこが間違っていますか?

public Top(String s) は、明示的に定義されたコンストラクターです。正解が言ったように、クラスに明示的に定義されたコンストラクターがない場合にのみ、デフォルトの引数なしコンストラクターがコンパイラーによって生成されます

于 2013-10-25T02:04:11.367 に答える