1. ホーム
  2. java

[解決済み] コンストラクタにsuper()を入れる必要はない?

2022-04-21 05:34:10

質問

これって、サブクラスのコンストラクタに入れないと、コンパイラが自動で入れてくれないんですか?

ということは、気にする必要もない?記事によっては出しているところもあるようです。

また、引数付きのコンストラクタを1つ持っている場合、これがコンストラクタになるのか、それとも引数リストなしのコンストラクタを取るのか?

どのように解決するのですか?

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

  • 引数なしのコンストラクタです。 パラメータを持たないコンストラクタです。
  • アクセスしやすい引数なしのコンストラクタです。 サブクラスから見えるスーパークラスの引数なしコンストラクタ。つまり、public か protected のどちらか、あるいは両方のクラスが同じパッケージ内にある場合はパッケージアクセスです; そして
  • デフォルトのコンストラクタ。 クラスに明示的なコンストラクタがない場合に、コンパイラが追加するパブリックな引数なしのコンストラクタです。

つまり、すべてのクラスには少なくとも1つのコンストラクタがあるということです。

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

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

スーパークラスに引数なしコンストラクタがないか、アクセスできない場合、(サブクラスのコンストラクタで)呼び出すスーパークラスのコンストラクタを指定しないと、コンパイラ エラーになるので、次のようになります。 が必要です。 を指定します。

例えば

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のno-argsコンストラクタはprivateなので、これもエラーになります。