📑

【Java】デフォルトSuperクラスコンストラクタ呼び出し君(継承している場合のデフォルトコンストラクタの理解より)

2022/08/04に公開

継承しているクラスでコンストラクタを利用した場合に以下が勝手に入ってきます。
継承している場合にはデフォルトコンストラクタに『super();』が勝手に入ってきます。
  デフォルトSuperクラスコンストラクタ呼び出し君↑

↓継承しているクラスでコンストラクタを利用した場合のデフォルトコンストラクタ

クラス名と同名(){
	super();
}

実験

コードをDokojavaに貼り付けると実行テストできます。
このマークです↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

// ファイル名
// Main.java

// 模擬Superクラス ※蛇足:ホントはpublicで別ファイルにするはず
class Plus100 {
	public Plus100(){
		System.out.println("Plus100の実行");
	}
	public Plus100(int i){
		System.out.println("Plus100の実行 引数は、" + i);
	}
}
class Plus500 extends Plus100 {
//	//継承している場合のデフォルトコンストラクタ
//	public Plus500(){
//		super(); //これも明示しないと毎度のコンストラクタで入ってきちゃう(引数なしのSuperクラスコンストラクタ呼び出し)
//	}
	public Plus500(){
		super(); //書かなくても勝手に入ってきちゃうデフォルトのSuperクラスコンストラクタ呼び出し
		System.out.println("Plus500の実行");
	}
	public Plus500(int i){
		super(i); //明示して書いておけば引数ありverが実行される(勝手に入ってくるほうは無効)
		System.out.println("Plus500の実行 引数は、" + i);
	}
}

class Main{
	public static void main (String[] args){
		//コンストラクタを呼び出し(引数なしver)
		Plus500 e = new Plus500();
		//コンストラクタを呼び出し(引数ありver)
		Plus500 e2 = new Plus500(888);
		
	}
}

上記のコードを使って色々実行して前のデフォルトコンストラクタの情報と照らし合わせると、以下が勝手に入ってきちゃうことが理解できました。

●コンストラクタとして記述しなくてもデフォルトコンストラクタが勝手に入ってきちゃう。
(mainでインスタンス化した場合に勝手に空のコンストラクタが呼び出されている。)
(*) デフォルトコンストラクタについては、前の記事です。

●継承関係のクラスでコンストラクタとして記述した場合に、デフォルトコンストラクタにスーパークラスのコンストラクタ呼び出しが勝手に入ってくる。また、コンストラクタを明示して記述した場合(コンストラクタを明示してデフォルトコンストラクタを無効にした場合)にもスーパークラスのコンストラクタ呼び出し『super();』が勝手に入ってくる。

勝手に入っているのは引数なしのコンストラクタ呼び出しだから引数ありのスーパークラスのコンストラクタを呼び出してあげたい場合は『super(i);』など明示してあげる必要があるとわかりました。

Discussion