バナー画像

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の使い方もしっかりと訓練しておきましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。