staticについて
JavaSilverSE11の勉強中、staticに関する問題を解いて、インスタンス変数と特徴が異なり、ややこしいと感じる点があったのでstaticについて調べてまとめてみました。
staticメンバとは?
staticメンバは、staticキーワードが付けられたフィールドやメソッド
のことです。
クラスに対して静的(static)に存在するメンバであるため、staticメンバは静的メンバ
とも呼ばれます。
インスタンスメンバとの違い
まずは異なる点をインスタンスメンバとstaticメンバの定義をもとにコードを通して紹介します。
class Sample {
int instanceNumber;
static int staticNumber;
void instanceMethod() {
System.out.println("instanceMethod()" + instanceNumber);
}
static void staticMethod() {
System.out.println("staticMethod()" + staticNumber);
}
}
上記のinstanceNumber
はインスタンス変数、staticNumber
はstatic変数です。
また、instanceMethod()
はインスタンスメソッド、staticMethod()
はstaticメソッドです。
インスタンスメンバとstaticメンバの違いは一見staticの有無だけのように見えますが、それだけではありません。
インスタンスメンバとstaticメンバの違いはメモリの保存場所
もあります。
例えば、インスタンスメンバは1つのクラスから3つのインスタンスを生成すれば「インスタンスメンバの数×3つ分」の領域が確保されるなど、
インスタンスメンバはクラスのインスタンス(オブジェクト)ごとに確保されます。
一方、staticメンバは例え複数インスタンスを生成してもstaticメンバの数1つ分の領域が確保されるだけです。
なぜならstaticメンバはクラス単位で領域が確保されるからです。
staticメンバの呼び出し方
staticフィールドやstaticメソッドの呼び出し方について紹介します。
【staticフィールドの呼び出し方】
クラス名.staticフィールド名
【staticメソッドの呼び出し方】
クラス名.staticメソッド名()
staticメンバはクラス単位で領域が確保されているため、クラス名を記述します。
これは、staticメンバはクラスが読み込まれた時点でメモリ上に展開されるからです。
staticのメリット
staticを使用することで以下のメリットがあります。
newを書くことなく、手軽に呼び出せる。
多くインスタンスを生成することを防ぎ、開発者の負担を減らすことが出来ます。
メモリの消費を抑える。
インスタンスの生成は多くメモリを消費しますが、staticはインスタンスを生成しないため
メモリの消費を抑えることが出来ます。
staticの注意点
staticには様々な制約があり、使用時には注意が必要です。
まず以下のコードを見てください。
public class Sample {
String instanceTmp;
static int staticNumber;
public static void staticMethod() {
Sample.staticNumber = (int)(Math.random() * 1000);
System.out.println(this.instanceTmp); //エラー発生
}
}
上記コードの処理はコメント記載部分でエラーとなります。
staticMethod()はstaticメソッドであるため、Sampleクラスのインスタンスが存在しない状況でも呼び出される
場合があります。
Sampleクラスのインスタンスが存在しない状況でstaticMethod()の処理をすると、「this.instanceTmp」をうまく処理出来なくなります。
そのため、staticメソッド内では、staticメンバしか利用できないことに注意してください。
まとめ
staticには以下の特徴があります。特徴をしっかり把握し、インスタンスメンバと使い分けることが大切になってきます。
・フィールドやメソッドにstaticをつけて宣言するとstaticメンバ(静的メンバ)として扱われる。
・staticメンバはクラス内に領域が確保される。
・インスタンスを生成しなくても利用できる。
・staticメソッド内では、staticメンバしか利用できない。
参考文献
-
[https://www.sejuku.net/blog/22426]
-
[https://hrzine.jp/article/detail/48]