web-dev-qa-db-ja.com

コンストラクタにsuper()を配置する必要はありませんか?

これをサブクラスのコンストラクターに入れない場合、コンパイラーによって自動的に入れられませんか?

それは私がそれを気にする必要さえないことを意味しますか?いくつかの記事で彼らはそれを出しました。

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

152
ajsie

まず、いくつかの用語:

  • 引数なしのコンストラクタ:パラメータなしのコンストラクタ。
  • アクセス可能な引数なしのコンストラクタ:サブクラスから見えるスーパークラス内の引数なしのコンストラクタ。つまり、パブリックまたは保護されているか、両方のクラスが同じパッケージにある場合はパッケージアクセスです。そして
  • デフォルトのコンストラクタ:クラスに明示的なコンストラクタがない場合にコンパイラによって追加されるパブリックな引数なしのコンストラクタ。

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

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

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

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

例えば:

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の引数なしのコンストラクタはプライベートであるため、これもエラーです。

212
cletus

スーパークラスコンストラクターに引数がない場合、Javaが自動的に呼び出します。引数がある場合、エラーが発生します。

src: http://Java.Sun.com/docs/books/tutorial/Java/IandI/super.html

50
lemon

引数なしのスーパーコンストラクターの呼び出しは、画面スペースとプログラマーの時間の無駄です。コンパイラは、記述したかどうかに関係なく、まったく同じコードを生成します。

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}

更新(2018年12月):

明示的なsuper()を記述すると、IDEでソースコードをナビゲートするのに役立ちます。

2018年12月の時点では、Eclipseも IntelliJ も、派生クラスのコンストラクターから基本クラスのコンストラクターに快適に移動する手段を提供していません。

20
Roland Illig

デフォルトの親コンストラクターは、呼び出さない場合でも子のデフォルトコンストラクターから呼び出されます。

メイン

public class Main {

    public static void main(String[] args) {
        A a = new B();
    }
}

A

public class A {

    public A() {
        System.out.println("A");
    }
}

B

public class B extends A {

    public B() {
        System.out.println("B");
    }
}

プリント

A
B
6
Yan Khonski

明示的に呼び出されるsuper([arguments])がない場合、クラスコンストラクターは常に "super()"を呼び出します。プログラミング中にスーパークラスコンストラクターへのアクセスを念頭に置いてください... .Objectクラス