応用第1日目:静的メンバ
静的メンバ
静的メンバとは
第6日目・第7日目で学んだフィールドやメソッドは、インスタンスを生成しなければ使用できませんでした。しかし、フィールドやメソッドの宣言にstaticをつけると、インスタンスを生成しなくても使用できるようになります。このようなフィールドやメソッドを静的メンバ(staticメンバ)と言います。
静的フィールドはインスタンスごとに独立した値を持つ通常のフィールドと異なり、クラス全体で1つの値を共有します。そのため、「生成されたインスタンスの数を記録する」といった用途に適しています。
サンプルプログラム
package exday1;
public class SampleClassEx01 {
private int value = 0;
private static int num = 0;
public SampleClassEx01(int value){
this.value = value;
num++;
}
public SampleClassEx01(){
this(100);
}
public static int getNumberOfInstance(){
return num;
}
public int getValue(){
return this.value;
}
}
package exday1;
public class SampleEx101 {
public static void main(String[] args) {
SampleClassEx01 s1,s2;
System.out.println("インスタンス数:"+SampleClassEx01.getNumberOfInstance());
s1 = new SampleClassEx01(50);
s2 = new SampleClassEx01();
System.out.println(s1.getValue());
System.out.println(s2.getValue());
System.out.println("インスタンス数:"+SampleClassEx01.getNumberOfInstance());
}
}
50
100
インスタンス数:2
staticフィールドのnumは、コンストラクタが呼ばれるたびに1ずつ増加します。インスタンスを2つ生成した後にgetNumberOfInstance()を呼び出すと2が返されます。staticメソッドはクラス名.メソッド名()の形式で呼び出せます。
また、SampleClassEx01には引数なしのコンストラクタと引数ありのコンストラクタの2種類があります。引数なしのコンストラクタ内でthis(100)と記述することで、引数ありのコンストラクタを呼び出しています。これにより、引数なしでインスタンスを生成した場合でも、valueに100が設定されます。(図1-1)
図1-1:引数なしコンストラクタと引数つきコンストラクタ
ガーベージコレクション
サンプルプログラム
次のサンプルでは、インスタンスメソッドと静的メソッドの呼び出し方の違いと、ガーベージコレクションの動作を確認します。
package exday1;
public class SampleEx102 {
public SampleEx102(){
System.out.println("コンストラクタ");
}
public void foo(){
System.out.println("インスタンスメソッド");
}
public static void bar(){
System.out.println("静的メソッド");
}
public static void main(String[] args) {
SampleEx102 i = new SampleEx102();
i.foo();
i.bar();
SampleEx102.bar();
bar();
System.gc();
}
}
インスタンスメソッド
静的メソッド
静的メソッド
静的メソッド
staticメソッドのbar()は、インスタンス変数i.bar()、クラス名SampleEx102.bar()、または同クラス内ではbar()と、3通りの方法で呼び出せます。いずれも同じ結果になります。
ガーベージコレクタ
System.gc()はガーベージコレクタ(Garbage Collector)を呼び出します。ガーベージコレクタとは、不要になったインスタンスをメモリから自動的に削除する仕組みです。ただし、System.gc()を呼び出してもガーベージコレクタがすぐに実行される保証はありません。Javaが適切なタイミングで実行します。(図1-2)
図1-2:ガーベージコレクタ