目次
はじめに
前回の記事では、Javaのインタフェースについて紹介しました。
本記事では、Javaのstatic変数とstaticメソッドについて紹介します。
staticとは
staticは変数(フィールド)やメソッドにつける修飾子です。
staticがついた変数やメソッドは、クラスのオブジェクト(インスタンス)を生成しなくても呼び出せます。
static変数は「クラス名.変数名」、staticメソッドは「クラス名.メソッド名」のように「クラス名.」の後に記述することで呼び出すことができるため、static変数はクラス変数、staticメソッドはクラスメソッドとも呼ばれています。
スポンサーリンク
static変数とは
static変数とは、static修飾子がついた変数のことです。また、static修飾子がついていない変数のことをインスタンス変数といいます。
static変数とインスタンス変数の違い
インスタンス変数は、クラスのオブジェクト(インスタンス)を生成したタイミングで作られる変数です。
そして、クラスのオブジェクト(インスタンス)毎に管理されています。(オブジェクト毎に変数が作られる)
static変数は、クラスのオブジェクト生成(インスタンス生成)に関係なく作られる変数です。(static変数に最初にアクセスしたタイミングで作られる)
そのため、クラスのオブジェクト(インスタンス)に関係なく共通で管理しています。(共通で1つの変数が作られる)
static変数の実装例
それでは、実際にソースコードでstatic変数の使用例を紹介します。
次の例では、フィールドにインスタンス変数「instanceNum」とstatic変数「staticNum」を定義し、「numPrint」メソッドでインスタンス変数とstatic変数の値に1を加算して、結果を出力しています。
[StaticSampleクラス]
public class StaticSample {
/**
* インスタンス変数
*/
public int instanceNum = 0;
/**
* static変数(クラス変数)
*/
public static int staticNum = 0;
/**
* 変数の値を出力
*/
public void numPrint() {
// インスタンス変数を加算
instanceNum++;
// static変数を加算
staticNum++;
System.out.println("インスタンス変数の値:" + instanceNum);
System.out.println("static変数の値:" + staticNum);
}
}
[プログラムの実行]
public class StaticSampleMain {
public static void main(String[] args) {
StaticSample sample1 = new StaticSample();
sample1.numPrint();
StaticSample sample2 = new StaticSample();
sample2.numPrint();
}
}
[実行結果]
インスタンス変数の値:1
static変数の値:1
インスタンス変数の値:1
static変数の値:2
プログラムを実行した結果、インスタンス変数は、クラスのオブジェクト(インスタンス)毎に管理している変数のため、出力結果はいずれも「1」です。
スポンサーリンク
static変数は、クラスのオブジェクト(インスタンス)に関係なく共通で管理している変数のため、出力結果は「sample1.numPrint()」のときは「1」、「sample2.numPrint()」のときは「2」と、sample1のオブジェクト(インスタンス)とsample2のオブジェクト(インスタンス)で値を共有しているのがわかります。
staticメソッドとは
staticメソッドとは、static修飾子がついたメソッドのことです。また、static修飾子がついていないメソッドのことをインスタンスメソッドといいます。
インスタンスメソッドは、クラスのオブジェクト(インスタンス)を生成したタイミングで使えるようになるメソッドです。それに対しstaticメソッドは、クラスのオブジェクト(インスタンス)を生成しなくても使用できます。
staticメソッドの使い方
staticメソッドの主な使い方は、インスタンスの状態に依存しない処理をさせることです。これはユーティリティメソッドとも呼ばれ、決まりきった処理などに用いられます。
例えば、標準APIのStringクラスで考えると、値を比較する「equals」メソッドはインスタンスメソッド、int型の変数をString型に変換する「valueOf」はstaticメソッドです。
public boolean equals(Object anObject) ← インスタンスメソッド
public static String valueOf(int i) ← staticメソッド
インスタンスメソッドである「equals」メソッドは、Stringオブジェクト(インスタンス)と一致しているかを比較するメソッドであり、Stringオブジェクト(インスタンス)の状態に依存しています。
[例]
String value = "あああ";
value.equals("いいい"); ← Stringのオブジェクト「value」に依存している
それに対し、staticメソッドである「valueOf」メソッドは、int型の変数をString型の変数に変換するメソッドであり、Stringオブジェクト(インスタンス)の状態に依存していません。
[例]
String newValue = String.valueOf(123); ← Stringのオブジェクトに関係ない処理
このように、staticメソッドの主な使い方は、インスタンスの状態に依存しない処理をさせることです。
staticメソッドの実装例
それでは、実際にソースコードでstaticメソッドの使用例を紹介します。
次の例では、インスタンスの状態に依存しないメソッド「isNumber」を定義しています。「isNumber」メソッドは正規表現を使い引数の値が数値であるかを判断する処理です。(※標準APIのPatternクラスを使用)
また「UtilitySample」クラスには、staticメソッドしか実装していないので、コンストラクタをprivateとし、外部からオブジェクト(インスタンス)を生成できないようにしています。
[UtilitySampleクラス]
import java.util.regex.Pattern;
public class UtilitySample {
private UtilitySample() {}
/**
* 数値チェック
* @param value 検証対象の値
* @return 結果(true:数値、false:数値ではない)
*/
public static boolean isNumber(String value) {
boolean result = false;
if (value != null) {
Pattern pattern = Pattern.compile("^[0-9]+$|-[0-9]+$");
result = pattern.matcher(value).matches();
}
return result;
}
}
[プログラムの実行]
public class UtilitySampleMain {
public static void main(String[] args) {
System.out.println("数値チェックの結果:" + UtilitySample.isNumber("あいうえお"));
}
}
[実行結果]
数値チェックの結果:false
終わりに
本記事では、JavaのJavaのstatic変数とstaticメソッドについて紹介しました。
次回の記事では、Javaの列挙型(enum)について紹介します。
次回の記事