Javaにはstaticメソッドやstatic変数というものがありますが、今回の記事では実際にstaticとはどういうものなのかについて解説をしていきます。
staticとは
staticとは「静的」を意味し、冒頭でも述べたようにJavaには「staticメソッド」や「static変数」というものがあります。staticの対義語には非staticというものもありますが、このstatic(静的)とは変わることのないものを表します。
よってstaticメソッドとは、他からの影響を受けることなく処理をさせる場合に記述するメソッドを指します。またstatic変数とは、インスタンス毎に変わることのないクラス全体で統一された値を持つ変数のことです。
宣言について
宣言は以下の通りです。
staticメソッド
アクセス修飾子(publicなど) static 型名 メソッド名(引数){}
static変数
アクセス修飾子(publicなど) static 型名 変数名;
コードの書き方
staticメソッド
基本となる書き方について説明します。
まず気を付けなければならないことは、非staticな変数やメソッドはstaticメソッドの中で使用することが出来ないという点です。
またインスタンス化による影響も受けないため、インスタンスを示すthisも使うことが出来ません。
記述についてですが、staticメソッドはその特徴としてnewを使わずに呼び出すことができます。記述方法は以下の通りです。
クラス名.メソッド名;
なお、mainメソッドの宣言には必ずstaticを付ける必要が有りますので忘れないようにしてください。
それでは実際のコードを使って解説していきます。
/* JavaSampleClass.java */ public class JavaSampleClass { public static void main(String[] args) throws Exception { sampleTest.sampleMethod(); } } /* sampleTest.java */ public class sampleTest { public static void sampleMethod() { var s_Str = "s_Str"; System.out.println(s_Str); } }
実行結果
s_Str
このコードでは、メインクラスであるJavaSampleClassのmainメソッドで、外部クラスであるsampleTestのsampleMethodというstaticメソッドを使用しています。
このコードの実行結果からも分かる通り、sampleTestをインスタンス化することなく呼び出しに成功しています。
では次にエラーとなるコードを見てみましょう。
/* JavaSampleClass.java */ public class JavaSampleClass { public static void main(String[] args) throws Exception { sampleTest.sampleMethod(); } } /* sampleTest.java */ public class sampleTest { var s_Str = "s_Str"; public static void sampleMethod() { System.out.println(s_Str); } }
実行結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem: 非 static フィールド s_Str を static 参照できません
このコードでは、先ほどのコードを基にローカル変数をメンバ変数に変えてみただけのコードです。ただしメンバ変数からはstaticを外しています。
実行結果はご覧の通り、コンパイルエラーが返ってきています。これで非staticな変数やメソッドはstaticメソッドの中で使用することが出来ないことが分かっていただけたと思います。
static変数
まず最初にstatic変数の記述に関してですが、static変数は次のように記述します。
クラス名.変数名;
また記述方法を見ていただいても分かるように変数名をクラス名の後ろに記述しますのでstatic変数は「クラス変数」と言います。逆に非static変数はインスタンス名の後ろに記述するため「インスタンス変数」とも言います。
static変数についても実際のコードを使って解説していきます。
/* JavaSampleClass.java */ public class JavaSampleClass { public static void main(String[] args) throws Exception { for (int i = 0; i < 3; i++) { sampleTest sc = new sampleTest(1, 1); sc.print(); } } } /* sampleTest.java */ public class sampleTest { public static int val_a = 0;// static変数 public int val_b = 0; // 非static変数 // コンストラクタ public sampleTest(int val_a, int val_b) { sampleTest.val_a += val_a; this.val_b += val_b; } // val_a, val_bの値をそれぞれ表示 public void print() { System.out.println("val_a = " + val_a + ", val_b = " + val_b); } }
実行結果
val_a = 1, val_b = 1 val_a = 2, val_b = 1 val_a = 3, val_b = 1
このコードでは、メインクラスであるJavaSampleClassのmainメソッドでfor構文を使い3回インスタンスを生成しています。外部クラスであるsampleTestではコンストラクタを使いインスタンス生成毎にval_a及びval_bに1を代入加算しています。
実行結果を見てみると、static変数である”val_a”ではインスタンス生成毎に1ずつ加算されているのに対し、非static変数である”val_2″ではインスタンス生成毎に値が初期化される為、何度繰り返しても1のままになっています。
この結果から、static変数に関しても「staticとは」で説明したようにstatic変数だけがインスタンスに左右されることなく、クラス全体で一つの値を共有するクラス変数の役割を担っていることが分かります。
まとめ
今回はstaticについてメソッドや変数の特徴や使い方の説明をしました。
staticの意味や使い方を正しく理解できていればきちんと整理されたコードを組むことが出来ますので、後々修正が必要になった場合にも最小部分の修正のみで完結することが可能です。
開発に慣れてくるとコード量も増えてきますので、正しいコードの構築を常に心がけ最小の構成で動作させることが出来るよう、staticの使い方もしっかりと訓練しておきましょう。