らいちの自由気ままなブロク -16ページ目

らいちの自由気ままなブロク

えーとこちらのブロクは、基本的日常のことと実況やラジオなどのYouTubeやツイキャス関係時たまプログラムについてなどいろいろです!
まぁ読者になってくれると嬉しいです!
面白いとかいいねとか思ったらお友達にでもURLを回して下さい、お願いします

こんにちわー( ´ ▽ ` )ノ

よく使う修飾子の1つ
static修飾子について
みなさんはこの修飾子のついたフィールドの
初期化タイミング
について、考えてみたことはありますか?
はっきり、僕はこれまでありませんでした(笑)
しかし、この前あることになり、このことについて考えることになりました(笑)

それは、
staticフィールドの参照した時、何故かnullが返ってくる
まぁ、あのコードだと確かにそうなっちゃうんですが(笑)
(´-`)oO{あの時の僕は馬鹿だった……}

でも、気になったので検証してみました。

まず、
mainクラスのstaticフィールドはいつ初期化されるか、
検証は簡単です
staticフィールドを1つ指定して、代入の所をstaticメソッドにすればいいのです

public static int a = aget;
public static int aget(){
 System.out.println("aget");
 return 5;
}
public static void main(String args[]){
 System.out.println("HelloJAVA");
}

(すみません 今iPodで打ってるのでタグが使えない(というか、面倒臭い)のでコード直打ちです><)

こちらのコードを実行すると、どうなると思います?
もちろんコンパイルエラーにはなりませんよ?
実行結果は
aget
HelloJAVA
となります!!
え?なに?
mainメソッドよりも前に実行されちゃうの!?
そうなんです、
mainクラスにあるstaticフィールドは上から順にmainメソッドが実行される前に初期化されるのです
ということは?
mainよりも前に実行するメソッドが作れるって訳!
いや、あまり意味がないんだけどね(笑)

それよりもこのあと、
これが普通のクラスだったらどうなるの?

コードは簡単
さっきのコードのmainメソッドをコンストラクターにしてあげればok
呼び出しは2通り用意します、
先にnewしてインスタンスを作る場合と、
先にstaticフィールドにアクセスする場合です
アクセスは
System.out.println(a);で
コードは面倒臭いので割愛
先にnewする場合
aget
HelloJAVA
5
先にstaticフィールドにアクセスした場合
aget
5
HelloJAVA
となります、

ということは
さらに、staticメソッドを使った場合も、先にstaticフィールドが初期化
されます
んもしかして、ということは?
そのクラスに何らかの形で最初にアクセスした時だけ、実行されるメソッドが作れる、ということでは?
まぁ、そういうことなんですけど、
でも、
javaにはこういう文法があります

class a{
 static{
  コード
 }
}

staticだけついてるメソッドみたいな物、
はい、これはstaticイニシャライザーといってC#でいう静的コンストラクタの変わりみたいな物です、
静的コンストラクタ、
つまり、何らかの形で最初にクラスのどこかにアクセスした時に実行されるコードです
はい、一々変数の初期化でstaticイニシャライザーを作る必要は無いのです。

以上、無駄知識でしたー!
いや、無駄じゃないんだけどね、
これ理解してあげないと書けないコード出てきたりするんだけどね?