【Java】static変数、staticメソッドの解説

Java
  • static変数って何?
  • staticってどうやって使うの?
  • staticを使うことのメリットって何?

この記事ではこのような疑問がある方に向けて初心者でも理解できるように丁寧に解説していきます。

ぜひ本記事を読んでstaticの理解を深めてコーディング作業で活用していってください。

staticとは?

ではstaticとは何なのか早速解説していきます。

通常Javaはインスタンス化することで他クラスの変数やメソッドへアクセスすることができるようになります。

しかしインスタンス化するのは面倒だと感じている方も多いのではないでしょうか?

そこでstaticを使用することで、インスタンス化しなくても他クラスの変数やメソッドへアクセスできるようになります。

そしてstaticを使用することでインスタンス化をしなくてもよくなるため、今までよりもアクセスが楽になるといったことや、処理速度が速くなるといったメリットがあります。

因みにstaticを使用して作成した変数やメソッドへはインスタンス化してアクセスすることも可能ですので、それも合わせて理解しておきましょう。

static変数、staticメソッドとは?

ではそんなstaticはどのように使用するのでしょうか?

使用方法としてはstatic変数、staticメソッドの2パターンがあります。

それぞれ使用方法と実行結果を解説していきます。

static変数

static変数はインスタンス化をしなくてもアクセスできる変数の事です。

static変数の構造は下記の通りとなります。

static 型 変数名;

単純に先頭にstaticをつけるだけという簡単なものです。

そして実際の使用例と実行結果は下記のようになります。

【使用方法】
public class ex1 {
	public static void main(String[] args) {

		System.out.println(ex2.a);

	}
}

public class ex2 {
	static int a=10;

}
【実行結果】
10

とても簡単なプログラムですが、ex2で変数aの前にstaticを付与することで、ex1からは「ex1.a」と記載するだけでアクセスできていることが分かると思います。

staticメソッド

次にstaticメソッドですが、こちらもstatic変数同様に下記のように先頭にstaticと付与するだけで使用することが可能となります。

static 戻り値 メソッド名(引数){}

そして実際の使用例と実行結果は下記の通りです。

【使用方法】
public class ex3 {
	public static void main(String[] args) {

		System.out.println(ex4.addition(20));
	}
}

public class ex4 {
	static int a;
	public static int addition(int b){
		return a=b+10;
	}
}
【実行結果】
30

additionメソッドへex3クラスをインスタンス化せずにアクセスできていることが分かると思います。

そして勘のいいひとならお分かりだと思いますが、mainメソッドもstaticが付与されています。

mainメソッドは一度もインスタンス化を実施したことはないと思いますが、mainメソッドはこのstaticが付与されていることでインスタンス化の必要性がないのです。

static初期化子

では最後にstatic初期化子について解説していきます。

static初期化子とは下記のようなコードがあったとします。

public class ex5 {
	public static void main(String[] args) {
		System.out.println(ex6.a);
	}
}

public class ex6 {
	static String a;
}

この実行結果はnullとなります。

特に問題はないように見受けられますが、値がnullでは色々と問題が出てくることがあります。

例えば文字列の長さを調べたいとなった場合に「ex6.a.length」と記述すると、NullPointerExceptionという例外が発生してしまいます。

インスタンス化の時はコンストラクタを使用することでフィールド変数を初期化することができていました。

しかしstatic変数となるとインスタンス化することがないためコンストラクタが呼ばれることがありません。

そのため初期化する方法がなく変数宣言時に値を代入するという方法しかないように感じます。

しかしこのstatic初期化子を使用することでstatic変数使用時でもstatic変数を初期化することが可能となります。

上記コードをstatic初期化子を使用した場合は下記のようになります。

public class ex5 {
	public static void main(String[] args) {
		System.out.println(ex6.a);
	}
}

public class ex6 {
	static String a;
	static {
		a="初期化します";
	}
}

これだけでstatic変数aを初期化することができます。

これはstatic初期化子があるクラスが読み込まれたタイミングで実行してくれるため、初期化されていない状態で変数を読み込むということがなくなります。

staticの注意点

static変数やstaticメソッドが大変便利であることはこれまでご紹介してきた通りです。

ではそんなstaticにはデメリットがないのかというとそんなことはありません。

主に下記のようなデメリットが存在します。

  • public修飾子を付与しているとどこからでもアクセスできる
  • オブジェクト指向プログラミングの利点を生かせない

一つずつ解説していきます。

public修飾子を付与しているとどこからでもアクセスできてしまう

public修飾子を付与するとどこからでもアクセスが可能となります。

修飾子に関しては下記記事で解説していますので、ぜひ一度読んでみてください。

【Java】変数の宣言と初期化方法 | エンジニアKISARAGIの備忘録 (kisaragi-it.com)

ではそれの何が問題なのかというと、どこからでもアクセスできてしまうということはそのオブジェクトとは全く関係のない所からもアクセスが可能であるということです。

関係のない所からアクセスが可能であると、プログラムを改良する際に想定していたところ以外からアクセスされたことで重大な不具合につながる可能性があります。

オブジェクト指向プログラミングの利点を生かせない

そしてstaticを付与するとオブジェクト指向プログラミングであるJavaの利点を生かすことができません。

どういうことかというと、Javaでは他クラスの変数やメソッドを使用する際にはインスタンス化するか、staticを使用するかの2つがあるということはご理解いただけていると思います。

そしてこの2つの方法を実行した場合それぞれのデータは全く異なる場所に保存されます。

インスタンス化した場合は「ヒープ領域」という空間に、staticなものは「static領域」と呼ばれる空間に配置されます。

そしてインスタンス化の方はインスタンス化するたびに「ヒープ領域」上に都度インスタンスが作成されていきます。

それに対してstaticの方は一度インスタンス化で「static領域」へ作成されたインスタンスはそれ以降何度インスタンス化しようとも増えることはありません。

例えば下記のようなコードがあったとします。

public class ex7 {
	public static void main(String[] args) {
		ex8 e1=new ex8();
		ex8 e2=new ex8();
		ex8 e3=new ex8();
		ex8 e4=new ex8();
		System.out.println(e1.st(10));
		System.out.println(e2.st(10));
		System.out.println(e3.in(10));
		System.out.println(e4.in(10));
	}
}

public class ex8 {
	static int a=10;
	int b=10;
	public int st(int c) {
		this.a=this.a+c;
		return this.a;
	}
	public int in(int d) {
		this.b=this.b+d;
		return this.b;
	}
}

上記はstaticな変数とstaticでない変数に10を足すという単純なものとなっています。

実行結果はどうなると思いますか?

20
30
20
20

このようになります。

staticな変数ですとaの値はインスタンス化を何度しても一つのaという値に足し算を実施していっていることが分かります。

staticでない変数の方はbの値はインスタンス化するごとに初期化されているように見えます。

これでは新しくインスタンスを作成したとしても前回のインスタンスの影響が残っていることになり、大変まずいこととなります。

現実で考えると新しく買ったパソコンだと思ったら実は中古品で以前使用していた人のデータが残っているようなものです。

これではどれだけ最新のPCを出荷しようとも実は中古品でしたという品が出回ってしまいます。

このことからstaticは本当に必要だと思う時にだけ使用するようにすることが大切です。

なんでも使いすぎはよくないということですね。

まとめ

この記事ではstaticに関して下記手順で解説してきました。

  • staticとは?
  • static変数、staticメソッドとは?
  • static初期化子
  • staticの注意点

インスタンス化をすることなく他クラスの変数やメソッドへのアクセスが可能であるということを分かっていただけたかと思います。

またstaticはインスタンス化しなくてもいいため、むやみやたらに乱発すしているとオブジェクト指向プログラミングの利点を生かし切ることができないため、使いどころを見極めていくことが大切です。

以上で今回の解説は終了となります。

コメント

タイトルとURLをコピーしました