コンストラクタに super() を置く必要はありますか? 質問する

コンストラクタに super() を置く必要はありますか? 質問する

これをサブクラスのコンストラクターに配置しない場合、コンパイラによって自動的に配置されるのではないですか?

つまり、気にする必要がないということですか? いくつかの記事ではそう書かれています。

引数を持つコンストラクターが 1 つある場合、これがコンストラクターになりますか、それとも引数リストのないコンストラクターを受け取りますか?

ベストアンサー1

まず最初にいくつかの用語を説明します。

  • 引数なしのコンストラクター:パラメータを持たないコンストラクタ。
  • アクセス可能な引数なしのコンストラクター:スーパークラスの引数なしコンストラクタはサブクラスから参照可能。つまり、public または protected のいずれか、または両方のクラスが同じパッケージにある場合はパッケージ アクセスであることを意味します。
  • デフォルトコンストラクタ:クラスに明示的なコンストラクターがない場合にコンパイラによって追加される、引数なしのパブリック コンストラクター。

したがって、すべてのクラスには少なくとも 1 つのコンストラクターがあります。

サブクラスのコンストラクタ5月サブクラスのコンストラクターのコードを実行する前に、スーパークラスのどのコンストラクターを呼び出すかを最初に指定します。

サブクラスのコンストラクターが呼び出すスーパークラスのコンストラクターを指定しない場合、コンパイラはスーパークラス内のアクセス可能な引数なしのコンストラクターを自動的に呼び出します。

スーパークラスに引数なしのコンストラクタがない場合、またはアクセスできない場合は、スーパークラスのコンストラクタを(サブクラスのコンストラクタで)呼び出すように指定しないとコンパイラエラーになるため、しなければならない指定されます。

例えば:

public class Base { }
public class Derived extends Base { }

これは問題ありません。明示的にコンストラクターを追加しない場合、Java によってパブリックのデフォルト コンストラクターが自動的に追加されるからです。

public class Base { }
public class Derived extends Base { public Derived(int i) { } }

また大丈夫です。

public class Base { public Base(String s) { } }
public class Derived extends Base { }

Base にはデフォルト コンストラクターがないため、上記はコンパイル エラーになります。

public class Base { private Base() { } }
public class Derived extends Base { }

Base の引数なしコンストラクターはプライベートなので、これもエラーになります。

おすすめ記事