スタティック修飾子(static)
スタティック修飾子とは、クラス、メソッド、変数などに指定できるキーワードの一つです。
スタティック修飾子を指定すると、クラスをインスタンス化しなくても、メソッドや変数にアクセスすることができます。
【実行結果】
敵機総数 : 2
敵機1ライフポイント : 10
敵機2ライフポイント : 20
敵機総数が2になっていることに着目してください。
サンプルコード上ではaddEnemy()メソッドを2回呼び出しています。
しかし呼び出しているのはそれぞれ異なるインスタンスです。
staticキーワードをつけることにより、インスタンスごとではなくクラスごとで扱われるようになります。
つまり、emy1インスタンス、emy2インスタンスが呼び出したaddEnemy()メソッド、sum変数は2つのインスタンス間で共有されるのです。
※クラスごとに共有するデータを格納しておくフィールドのことをクラス変数と言い、インスタンスを生成しなくても呼び出せるメソッドのことをクラスメソッドと言います。
また、getSum()メソッドにもstaticキーワードがつけられています。
これにより、このメソッドもクラスメソッドとなり、インスタンスを生成しなくてもメソッドを呼び出せるようになります。
クラスメソッドは『クラス名.クラスメソッド(引数)』という形で呼び出すことができます。
※『インスタンス.クラスメソッド(引数)』という形でも呼び出せます。
※クラスメソッドはインスタンス変数にアクセスすることはできません。クラスメソッドがアクセスできる変数はクラス変数だけです。
スタティック修飾子を指定すると、クラスをインスタンス化しなくても、メソッドや変数にアクセスすることができます。
public class Sample{
public static void main(String[] args){
Enemy emy1;
Enemy emy2;
emy1 = new Enemy(); //インスタンス生成
emy2 = new Enemy(); //インスタンス生成
emy1.addEnemy(); //クラスメソッド呼び出し
emy2.addEnemy(); //クラスメソッド呼び出し
emy1.setLife(10); //インスタンスメソッド呼び出し
emy2.setLife(20); //インスタンスメソッド呼び出し
System.out.println("敵機総数 : " + Enemy.getSum());
System.out.println("敵機1ライフポイント : " + emy1.getLife());
System.out.println("敵機2ライフポイント : " + emy2.getLife());
}
}
class Enemy{
static int sum = 0;
int life;
static void addEnemy(){
sum++;
}
static int getSum(){
return sum;
}
void setLife(int life){
this.life = life;
}
int getLife(){
return life;
}
}
【実行結果】
敵機総数 : 2
敵機1ライフポイント : 10
敵機2ライフポイント : 20
敵機総数が2になっていることに着目してください。
サンプルコード上ではaddEnemy()メソッドを2回呼び出しています。
しかし呼び出しているのはそれぞれ異なるインスタンスです。
Enemy emy1;ここで着目していただきたいのは、EnemyクラスのaddEnemy()メソッドとsum変数にstaticキーワードがつけられている点です。
Enemy emy2;
emy1 = new Enemy(); //インスタンス生成
emy2 = new Enemy(); //インスタンス生成
emy1.addEnemy(); //クラスメソッド呼び出し
emy2.addEnemy(); //クラスメソッド呼び出し
staticキーワードをつけることにより、インスタンスごとではなくクラスごとで扱われるようになります。
つまり、emy1インスタンス、emy2インスタンスが呼び出したaddEnemy()メソッド、sum変数は2つのインスタンス間で共有されるのです。
※クラスごとに共有するデータを格納しておくフィールドのことをクラス変数と言い、インスタンスを生成しなくても呼び出せるメソッドのことをクラスメソッドと言います。
また、getSum()メソッドにもstaticキーワードがつけられています。
これにより、このメソッドもクラスメソッドとなり、インスタンスを生成しなくてもメソッドを呼び出せるようになります。
System.out.println("敵機総数 : " + Enemy.getSum());クラスメソッドは『クラス名.クラスメソッド(引数)』という形で呼び出すことができます。
※『インスタンス.クラスメソッド(引数)』という形でも呼び出せます。
※クラスメソッドはインスタンス変数にアクセスすることはできません。クラスメソッドがアクセスできる変数はクラス変数だけです。
