静的メンバ
オブジェクトのないメンバ
これまでのメンバは全てオブジェクトに関連付けられていました
メンバを呼び出すには、必ずオブジェクト(インスタンス)が必要でしたね
このようなメンバをインスタンスメンバと呼びます
クラスの章でやりましたね
この章では、メンバのもう一つのタイプ、静的メンバを紹介します
静的メンバにはインスタンスは必要ありません
全てのオブジェクトから共有したい変数やメソッドに使われます
静的メンバの宣言にはstaticキーワードを使用します
静的メンバ変数
static type member_var;
静的メソッド
static type menber_func(param_list)
member_varは静的メンバ変数の宣言
member_func(param_list)は静的メソッドの宣言書式です
それぞれtypeにはデータ型を指定します
もちろん、初期化や同じデータ型の変数の複数宣言もインスタンスメンバ同様に可能です
「アッ!ひょっとしてmain()メソッドで使ってたやつ?」、そう、あのstaticキーワードです
public static void main(String args[])
main()メソッドにインスタンスはありませんでした
その理由はstaticにあったのです。staticキーワードを指定したメンバは単体で動けるのです
C言語の関数に等しい存在ですね
JAVA言語プログラムは全てがクラスの中で動くので、staticを宣言して単体のメソッドを作成します
静的メンバにアクセスするには次の書式を使用します
cls_name.member;
cls_nameにはその静的メンバが宣言されているクラス名を指定します
見てのとおり、静的メンバはインスタンスにではなくクラスに直接結びついているのです
以下は静的メンバの使用例です
class LOVE_HINA {
static String name = "前原しのぶ";
static int age = 13;
static void write() {
System.out.println(name + "\t" + age);
}
}
class test {
public static void main(String args[]) {
System.out.println("名前\t\t年齢");
LOVE_HINA.write();
LOVE_HINA.name = "成瀬川なる";
LOVE_HINA.age = 17;
LOVE_HINA.write();
}
}
LOVE_HINAクラスに登録されているメンバは全て静的メンバです
インスタンス作成の必要はありません
デフォルトではしのぶちゃんのデータが登録されています
write()メソッドも同様にインスタンスは必要なく、静的なnameとageメンバ変数を出力します
さらに、静的メンバにはクラス生成時に実行するコードブロックを作成できます
このコードブロックは、いわば静的メンバ用のコンストラクタ的存在です
このコードブロックを静的初期化ブロックと呼びます
静的初期化ブロックは、配列のメンバ変数の初期化をループを使って行う時などに使えます
このブロックはstaticキーワードに続けて記述します
static {
statements...
}
statementsに、クラス生成時に実行するステートメントを記述します
静的初期化ブロックは、クラスが作成されたときに一度だけ実行されます
class LOVE_HINA {
static String name[] = new String[2];
static int age[] = new int[2];
static {
name[0] = "前原しのぶ";
age[0] = 13;
name[1] = "成瀬川なる";
age[1] = 17;
}
static void write(int index) {
System.out.println(name[index] + "\t" + age[index]);
}
}
class test {
public static void main(String args[]) {
System.out.println("名前\t\t年齢");
LOVE_HINA.write(0);
LOVE_HINA.write(1);
}
}
それと、これまではクラス名を使って静的メンバを呼び出してきましたが
とうぜんオブジェクトから呼び出すこともできます
ただし、当然呼び出される内容は全て共通のアドレスです
静的メンバは、インスタンスに関係なく、全て同じアドレスが参照されます
class LOVE_HINA {
static String title = "ラブひな";
String name;
int age;
void write() {
System.out.println(name + "\t" + age + "\t" + title);
}
LOVE_HINA(String s , int a) {
name = s;
age = a;
}
}
//注)このサンプルプログラムに使われている固有名称は
//実在する団体、個人、ラブコメコミックスとは一切関係ありません(笑)
class test {
public static void main(String args[]) {
LOVE_HINA naru = new LOVE_HINA("成瀬川なる" , 17);
LOVE_HINA sinobu = new LOVE_HINA("前原しのぶ" , 13);
System.out.println("名前\t\t年齢\tコミック名");
naru.write();
sinobu.write();
}
}
どのオブジェクトでwrite()が呼び出されても、titleメンバ変数の返す値は全て同じです
結果は次のようになりました
名前 年齢 コミック名
成瀬川なる 17 ラブひな
前原しのぶ 13 ラブひな
static
メソッドや変数の修飾子として使用します
static宣言されたメソッドや変数は、インスタンスに関係なく一つしか作成されません
どのインスタンスで呼び出されても、同じアドレスを参照します
静的初期化ブロックの作成にも使用されます
静的初期化ブロックは、クラス生成時の一度のみ実行されるコードブロックです