0

これについてフィードバックをいただけますか

"new House("x ")" が文字列を送信すると、"House(String name)" コンストラクターが Building スーパークラス コンストラクター "Building(String name)" を呼び出すと予想していました。その場合、答えは「bn xh hn x」になります。ただし、答えは「bh hn x」です(はい、その出力で実行されます)。

質問 1. "new Building("string_value")" の呼び出し以外に、House が "Building(String name)" コンストラクターを呼び出す状況はありますか? (つまり、House コンストラクターの追加コード以外は? 2. オーバーロードされた Building (String name) コンストラクターではなく、引数のない Building コンストラクターが呼び出されるのはなぜですか?サブクラスから特定のスーパー コンストラクターを呼び出す必要がある場合があります。

参照しやすいようにコードが含まれています。

答えは「bh hn x」です。

class Building {
    Building() {System.out.print("b ");}
    Building(String name) {this(); System.out.print("bn "+name);}
}

public class House extends Building {
    House() {System.out.print("h ");}
    House(String name) { this();System.out.print("hn "+name);}

    public static void main(String a[]) {
        new House("x "); }
}

よろしくスコット

4

2 に答える 2

0

明示的なスーパークラス コンストラクター呼び出しが提供されず、同じクラス内のコンストラクターへの呼び出しも提供されない場合、引数のないスーパークラス コンストラクターが常に呼び出されます。Java はそのように設計されており、JVM が最初に呼び出されたコンストラクターを記録し、それをスーパークラス コンストラクターと一致させようとするのは、複雑すぎて非効率的です。

別のスーパークラス コンストラクターを呼び出す必要がある場合は、次のように明示的に呼び出します。

super(foo,bar);
于 2011-04-17T20:20:06.560 に答える
0

別のクラスから継承する場合は、コンストラクターで super() を呼び出す必要があります。そうしないと、ご覧のとおり、コンパイラがその呼び出しを挿入します。

そうしないと、オブジェクトが初期化されていない状態のままになるため、スーパークラスのコンストラクターが呼び出されます。

プログラムの実行順序は次のとおりです。

  1. 新しい家("x"); 最初のステートメントが this() または super() のいずれかである必要があることはすでにわかっているため、これは this() のために同じクラスのデフォルト コンストラクターを呼び出します。

  2. 上記のコンストラクターで this() を呼び出すと、House() コンストラクターが実行されます。現在、House() には this() 呼び出しがないため、コンパイラはデフォルトの super() を配置し、基本クラスのデフォルト コンストラクターを呼び出し、

したがって、出力は bh hn x

于 2011-04-17T20:30:32.437 に答える