🦍

【Java】コンストラクタからコンストラクタを呼び出す(備忘録)

2023/01/22に公開

1.まず最初に

コンストラクタとは

2.文法と処理の流れについて

this を使用して、同じクラスの他のコンストラクタを呼び出します。

呼び出し元のコンストラクタから呼び出し先のコンストラクタへ処理が移ります。
 不適切な this の使い方を使用すると無限ループが発生するので、注意してください。

3.サンプルプログラム

〇例1:正しい書き方

Sample1.java
package lesson.java;

public class Sample1 {
        // メンバ変数(フィールド)
        String LastName;

        /* 呼び出し元コンストラクタ */
        public Sample1(){
            // 引数ありコンストラクタを呼び出す
            this("山田");	
        }
		
        /* 呼び出し先コンストラクタ */
        public Sample1(String Name){
            // メンバ変数に引数の値を入れる
            this.LastName = Name;
        }
}
Sample2.java
package lesson.java;

public class Sample2 {
	public static void main(String args[]) {
		// Sample1クラスからインスタンス作成
		Sample1 ShowName_1 = new Sample1();
		Sample1 ShowName_2 = new Sample1("山本");
		Sample1 ShowName_3 = new Sample1("田中");
		
		System.out.println(ShowName_1.LastName);
		System.out.println(ShowName_2.LastName);
		System.out.println(ShowName_3.LastName);		
	}
}
実行結果
山田
山本
田中

〇例2:無限ループが起きる不適切な書き方

Sample1.java
package lesson.java;

public class Sample1 {
		// メンバ変数(フィールド)
		String LastName;

		/* 呼び出し先コンストラクタ */
		public Sample1(){
			LastName = "山田";	
		}
		
		/* 呼び出し元コンストラクタ */
		public Sample1(String Name){
			// 引数なしコンストラクタを呼び出す
			this();
			// メンバ変数に引数の値を入れる
			this.LastName = Name;
		}
}
Sample2.java
package lesson.java;

public class Sample2 {
	public static void main(String args[]) {
		// Sample1クラスからインスタンス作成
		Sample1 ShowName_1 = new Sample1();
		Sample1 ShowName_2 = new Sample1("山本");
		Sample1 ShowName_3 = new Sample1("田中");
		
		System.out.println(ShowName_1.LastName);
		System.out.println(ShowName_2.LastName);
		System.out.println(ShowName_3.LastName);		
	}
}

例2の解説
① 先ずインスタンス作成処理 Sample1 ShowName_2 = new Sample1("山本"); が実行され、引数ありコンストラクタ public Sample1(String Name) が呼び出されます。
② 引数ありコンストラクタ内の this(); が呼び出され、引数なしコンストラクタ public Sample1() 内の処理が実行されます。
③ 引数なしコンストラクタ内の処理終了後、再び引数ありコンストラクタ public Sample1(String Name) が呼び出され無限ループが発生します。

4.参考

5.2 コンストラクタから別のコンストラクタを呼ぶ

Discussion