🎯

【Java】クラス解説32・インスタンスイニシャライザ

2024/05/09に公開

インスタンスイニシャライザ

  1. インスタンスイニシャライザとは、インスタンスが生成される度に毎回実行されます。
  2. これまでに学習したコンストラクタもインスタンスが生成される度に毎回実行されます。ただし、その順序はインスタンスイニシャライザが先で、コンストラクタが後になります。
  3. コンストラクタがオーバーロードされている場合でも、インスタンスイニシャライザは共通の初期化処理として利用可能です。
  4. サブクラスのインスタンスが生成された時、スーパークラス及びサブクラスにインスタンスイニシャライザが存在する場合は、その実行順はスーパークラスが先で、サブクラスが後になります

インスタンスイニシャライザのコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // インスタンスの生成
        Fuzi fz = new Fuzi();
    }
}
class Fuzi {
    // フィールド
    int fuzi;
    
    // インスタンスイニシャライザ
    {
        fuzi = 23;
        System.out.println(fuzi);
    }
}

出力結果

23

出力結果より、インスタンスが生成されて、インスタンスイニシャライザが実行されたことが分かりました。


インスタンスイニシャライザとコンストラクタの順序に係るコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // インスタンスの生成
        Fuzi fz = new Fuzi(2323);
    }
}
class Fuzi {
    // フィールド
    int fuzi;
    
    // インスタンスイニシャライザ
    {
        fuzi = 23;
        System.out.println(fuzi);
    }
    
    // コンストラクタ(引数あり)
    public Fuzi(int n) {
        fuzi = n;
        System.out.println(fuzi);
    }
}

出力結果

23
2323

出力結果より、実行順はインスタンスイニシャライザが先で、コンストラクタが後であることが分かりました。


インスタンスイニシャライザとコンストラクタのオーバーロードに係るコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // インスタンスの生成
        Fuzi fz1 = new Fuzi();
        Fuzi fz2 = new Fuzi(2323);
    }
}

class Fuzi {
    // フィールド
    int fuzi;

    // インスタンスイニシャライザ
    {
        fuzi = 23;
        System.out.println("インスタンスイニシャライザ: " + fuzi);
    }

    // コンストラクタのオーバーロード
    // コンストラクタ(引数なし)
    public Fuzi() {
        System.out.println("デフォルトコンストラクタ");
    }

    // コンストラクタ(引数あり)
    public Fuzi(int n) {
        System.out.println("引数のあるコンストラクタ: " + n);
    }
}

出力結果

インスタンスイニシャライザ: 23
デフォルトコンストラクタ
インスタンスイニシャライザ: 23
引数のあるコンストラクタ: 2323

出力結果より、実引数のないインスタンスが生成された時は、インスタンスイニシャライザが実行された後、デフォルトコンストラクタが実行されています。
そして、実引数のあるインスタンスが生成された時は、インスタンスイニシャライザが実行された後、引数のあるコンストラクタが実行されています。


スーパークラスとサブクラスのインスタンスイニシャライザの順序に係るコード例

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // サブクラスのインスタンスの生成
        Sakura sk = new Sakura();
    }
}
// スーパークラス
class Fuzi {
    // インスタンスイニシャライザ
    {
        System.out.println("スーパークラス");
    }
}
// サブクラス
class Sakura extends Fuzi {
    // インスタンスイニシャライザ
    {
        System.out.println("サブクラス");
    }
}

出力結果

スーパークラス
サブクラス

出力結果より、サブクラスのインスタンスが生成されてからのインスタンスイニシャライザの実行順は、スーパークラスが先で、サブクラスが後であることが分かりました。


https://zenn.dev/goriki/articles/006-about-constructor

https://zenn.dev/goriki/articles/007-constructor-with-no-dummy-argument

https://zenn.dev/goriki/articles/008-constructor-with-a-dummy-argument

Discussion