web-dev-qa-db-ja.com

スーパークラスコンストラクターを明示的に呼び出す必要があるのはいつですか?

したがって、スーパークラスを拡張するサブクラスがあるとしましょう。スーパークラスコンストラクターを実行するには、どのようなシナリオでsuper()を明示的に入力する必要がありますか?

私は抽象クラスに関する本の例を見ており、非抽象サブクラスで拡張すると、サブクラスのデフォルトコンストラクターは空白になり、スーパークラスのデフォルトコンストラクターが呼び出されるというコメントがあります。同時に、ここで、誰かの問題がsuper()を明示的に呼び出していなかったインスタンスも見ました。

サブクラスのデフォルト/デフォルト以外のコンストラクタからスーパークラスのデフォルト/デフォルト以外のコンストラクタを呼び出すこととの違いはありますか?

95
jhlu87

あなたneverちょうど必要

super();

他に何も指定しないと、そこにあります。 only次の場合に呼び出すコンストラクタを指定する必要があります。

  • パラメーターを持つスーパークラスコンストラクターを呼び出したい
  • スーパークラスコンストラクターではなく、同じクラスの別のコンストラクターにチェーンしたい

あなたはそれを主張します:

同時に、ここで、誰かの問題が明示的にsuper()を呼び出していなかったインスタンスも見ました。

例を挙げていただけますか?私はそれがどのように可能であるか想像できません...

139
Jon Skeet

スーパーコンストラクターを明示的に呼び出さない場合は、引数なしのコンストラクター(super())が呼び出されます。これは、スーパークラスの引数なしの到達可能なコンストラクタがない場合、特定のコンストラクタを自分で呼び出す必要があることを意味します。

しかし、デフォルトのコンストラクターを使用できたとしても、とにかく別のコンストラクターが必要な場合がよくあります-コードによって異なります。

また、コンストラクターが宣言されていない場合、コンパイラーはパブリックのデフォルトコンストラクターを自動的に生成しますが、独自のコンストラクターを作成するとすぐにこれは発生しません。

10
Voo

super()メソッドは、コードで明示的に記述されていなくても、サブクラスのコンストラクターで常に呼び出されます。

あなたがそれを書く必要があるのは、異なる初期化パラメータを持つスーパークラスにいくつかのsuper(...)メソッドがある場合だけです。

4
Omnaest