これをサブクラスのコンストラクターに入れない場合、コンパイラーによって自動的に入れられませんか?
それは私がそれを気にする必要さえないことを意味しますか?いくつかの記事で彼らはそれを出しました。
そして、引数を持つコンストラクタを1つ持っている場合、これはコンストラクタになりますか、それとも引数リストなしのコンストラクタを取りますか?
まず、いくつかの用語:
したがって、すべてのクラスには少なくとも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の引数なしのコンストラクタはプライベートであるため、これもエラーです。
スーパークラスコンストラクターに引数がない場合、Javaが自動的に呼び出します。引数がある場合、エラーが発生します。
src: http://Java.Sun.com/docs/books/tutorial/Java/IandI/super.html
引数なしのスーパーコンストラクターの呼び出しは、画面スペースとプログラマーの時間の無駄です。コンパイラは、記述したかどうかに関係なく、まったく同じコードを生成します。
class Explicit() {
Explicit() {
super();
}
}
class Implicit {
Implicit() {
}
}
更新(2018年12月):
明示的なsuper()
を記述すると、IDEでソースコードをナビゲートするのに役立ちます。
2018年12月の時点では、Eclipseも IntelliJ も、派生クラスのコンストラクターから基本クラスのコンストラクターに快適に移動する手段を提供していません。
デフォルトの親コンストラクターは、呼び出さない場合でも子のデフォルトコンストラクターから呼び出されます。
メイン
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
明示的に呼び出されるsuper([arguments])がない場合、クラスコンストラクターは常に "super()"を呼び出します。プログラミング中にスーパークラスコンストラクターへのアクセスを念頭に置いてください... .Objectクラス