BLOG

【プログラマー 研修 Java】まんじゅうの記録5



ごきげんよう、「ぶつ森」でも「あつ森」でもなく「どう森」派のまんじゅうです。



世間はすっかり「あつまれ どうぶつの森」フィーバーですね。



どこに行っても広告を見かけますし、毎日誰かやってる話を聞くので、

非常にミーハー心を揺さぶられているのですが……



どうぶつの森 ポケットキャンプ一瞬で飽きたしな( ^ω^)・・・


というかSwitch持ってないしな( ^ω^)・・・


そもそも在庫切れでスイッチ売られてないしな( ^ω^)・・・




Switchの再販を待つ間、ゲーム実況見て「どう森」欲を満たしながら、

この熱が冷めるのを待とうと思います。(結局買わんのかーい!)



学習内容

今回、新たに知った“static初期化ブロック” と “初期化ブロック” についてまとめますが、

その前に少し “コンストラクタ” について振り返ってみましょう。


コンストラクタ


コンストラクタとは、クラスのインスタンス生成したときに実行されるメソッドで、

主にそのクラスのメンバ変数を初期化するときに使用します。

public class Main {
  public static void main(String[] args) {
    Hero h = new Hero();

    System.out.println(h.hp);
  }
}

public class Hero {
  String name;
  int hp;

  public Hero(){
    this.hp = 100;
  }
}

例えば、こちらはMainクラスでHeroクラスをインスタンス化しています。

インスタンス生成と同時にコンストラクタにより hpフィールドに 100 が代入され、

実行結果として「100」と表示されます。

初期化ブロックとstatic初期化ブロック


さぁコンストラクトを振り返ったところで……

static初期化ブロックと初期化ブロックについて見ていきましょう。



まずは初期化ブロックについて。

オブジェクトの初期化を行うための仕組みに初期化ブロックがあり、インスタンスの生成時に実行されます。

https://www.task-notes.com/entry/20151027/1445914800




続きましてstatic初期化ブロックについて。

オブジェクト用の初期化ブロックと同様の仕組みとして、クラス用にstatic初期化ブロックがあり、クラス自身の初期化時に実行されます。

https://www.task-notes.com/entry/20151027/1445914800



あ、あれ( ^ω^)・・・




コンストラクタと同じ???



インスタンスの生成時に実行される???


そこで疑問が生まれるわけですよ。



インスタンス生成時に実行されるコンストラクタ

インスタンス生成時に実行される初期化ブロック

インスタンス生成時に実行されるstatic初期化ブロック



この3つのメソッドどの順番で実行されるの?



はい、気になったら実際にやってみる。これ鉄則。

さぁ早速やってみましょう。

public class SomeTest {

    static int staticVariable;
    int instanceVariable;        

    // Static initialization block:
    static {
        System.out.println("Static initialization.");
        staticVariable = 5;
    }

    // Instance initialization block:
    {
        System.out.println("Instance initialization.");
        instanceVariable = 10;
    }

    // Constructor
    public SomeTest() {
        System.out.println("Constructor executed.");
    }

    public static void main(String[] args) {
        new SomeTest();
        new SomeTest();
    }
}

https://stackoverflow.com/questions/21923269/static-initializers-vs-instance-initializers-vs-constructors




気になる実行結果はこちらです。

Static initalization.
Instance initialization.
Constructor executed.
Instance initialization.
Constructor executed.



<分かったこと>

static初期化ブロック、初期化ブロック、コンストラクタの順で実行される。

・static初期化ブロックは1回のみ実行される。



どうですか、みなさんの予想は当たっていましたか?

JavaSilverの問題集で実行の順番を問われる問題もあったので覚えておくといいかもしれません。

ふりかえり



このように勉強しても、まだまだ知らないことがたくさんあるんですね。


研修はあと少しで終わりますが、勉強に終わりはないと思うので、

常に学ぶ姿勢を忘れず頑張ろうと思います。(きゃー真面目なのバレちゃう…!)



話過ぎるとぼろが出るので、本日はここらへんで。アデュー!

BLOGトップへ戻る