[解決済み] コンストラクタに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なので、これもエラーになります。
関連
-
[解決済み] C++で、あるコンストラクタを別のコンストラクタから呼び出す(コンストラクタ・チェイニングを行う)ことは可能ですか?
-
jd-gui Java Exceptionが発生しました。
-
eclipse の実行時に java 仮想マシンが見つからなかった
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] コンストラクタ内の仮想メンバー呼び出し
-
[解決済み] あるコンストラクタを別のコンストラクタから呼び出す
-
[解決済み] 文字列を繰り返す簡単な方法
-
[解決済み] コンストラクタのシグネチャを定義するインターフェース?
-
[解決済み】PECS(Producer Extends Consumer Super)って何?)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IllegalArgumentException この例外を解決する方法
-
プロローグでのコンテンツは禁止されています
-
Methodのinvokeメソッド実装のJavaリフレクション
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 0 at One1.main(One1.java:3)
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
xxx:jarのアーティファクトディスクリプタの読み込みに失敗した問題は解決しました。
-
Error: java.lang.NoClassDefFoundError: クラス XXXX を初期化できませんでした
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決
-
[解決済み】Javaでカスタム例外クラスを定義する最も簡単な方法とは?