0

ここに行きます:

public class Parent {

    public Parent(String name) {
        this.name = name;
    }

    public String name = null;

}

public class Child extends Parent {

    public Child(String name) {
        super(name); // If I comment this : Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor
    }

}

「自分でスーパーコンストラクターを呼び出さない場合、コンパイラーはコンストラクターの最初のステートメントとして、引数なしの super() 呼び出しを挿入します」と言われています。

  • これは、引数付きのコンストラクターにも当てはまりますか?
  • コンパイラは、子コンストラクターと同じシグネチャで引数付きのスーパー コンストラクターを呼び出してはいけませんか?
  • なぜこのような設計になったのでしょうか。
4

2 に答える 2

1

これは、引数付きのコンストラクターにも当てはまりますか?

はい。

コンパイラは、子コンストラクターと同じシグネチャで引数付きのスーパー コンストラクターを呼び出してはいけませんか?

いいえ。別の基底クラス コンストラクターを呼び出す場合は、必要に応じて引数を渡して、自分で呼び出す必要があります。

なぜこのような設計になったのでしょうか。

あなたが提案している代替手段(すべての引数を自動的に転送する)は、一般的にはあまり役に立たないからです。

于 2013-07-07T03:43:35.133 に答える
0

と言われている発言は不正確です。スーパークラスのいずれかのコンストラクターの呼び出し、またはクラス自体の別のコンストラクターの連鎖呼び出しで始まらない子クラスのコンストラクターには、スーパークラスの引数のないコンストラクターが暗黙的に挿入されます。

スーパークラス コンストラクターを別のシグネチャで呼び出すことは十分に可能であり、多くの場合非常に便利です。次の仮説を考えてみましょう。

public class SquareRootException extends IllegalArgumentException {
    public SquareRootException(double negativeValue) {
        super(String.format("Attempt to take the square root of the negative number %f",
              negativeValue);
        }
    }
    ...
}

なぜプログラマーは不要なコードを書かなければならないのでしょうか?

于 2013-07-07T03:54:46.680 に答える