クラスメソッド


前回はクラス変数についてみました。今回はクラスメソッドについてみていきます。

クラスメソッドとは

wikipedia引用

クラスメソッド (class method) とはクラスに属するメソッドのことであり、インスタンスを生成せずにクラスから直接呼び出すことができる。基本的に、その振る舞いは非オブジェクト指向言語における関数と変わらない。

クラス変数と考え方は同じです。1つのクラスから複数のインスタンスが生成できます。インスタンスメソッドを参照するときは、どのインスタンスのメソッドなのか指定して参照します。同様にクラスメソッドの場合は、どのクラスのメソッドなのか指定して参照します。インスタンスメソッドは各インスタンスに属するのに対し、クラスメソッドはクラスに属します。

java095

クラスメソッドの宣言

【StaticSample.java】

public class StaticSample {
    static void method_1(){
    	System.out.println("クラスメソッドです。");
    }
    void method_2(){
    	System.out.println("クラスメソッドではありません。");
    }
}

「StaticSample」クラスでは2つのメソッドがあります。メソッドは基本的にインスタンスが生成されると、そのインスタンスに属するインスタンスメソッドとなりますが、あるキーワードを付けることによりクラスメソッドにすることができます。

    static void method_1(){

static 返却値の型 クラスメソッド名{ ・・・}

「static」キーワードをメソッド宣言時につけることによりクラスメソッドとなり、クラスに属するメソッドとなります。

クラスメソッドの参照

【Sample.java】

public class Sample{
    public static void main(String[] args) {
    	StaticSample.method_1();
    }
}

3行目でクラス名を指定してメソッドを参照しています。クラスに属しているので直接クラスから参照できます。数学の公式を計算をするメソッドなど、いちいちインスタンスを生成せず「非オブジェクト指向言語における関数」のように使いたい場合に便利です。

では、クラスメソッドでない「method_2」メソッドをクラスを指定して直接参照するとどうなるかみてみます。

    StaticSample.method_2();

Exception in thread "main" java.lang.Error: Unresolved compilation problem
型 StaticSample の非 static メソッド method_2() を static 参照することはできません

結果はエラーになります。クラスメソッドでないメソッドは、インスタンス生成後にインスタンスメソッドとなります。各インスタンスに属するメソッドなのでクラス指定では参照できません。

クラスメソッドの注意点

public class StaticSample {
	int field;
	static void method(){
        this.field = 100;
    }
}

クラスメソッドはクラスメソッドに属してるので、クラスメソッドの処理の中にインスタンスに属する変数は書けません。サンプルではクラスメソッドの中で変数fieldを使っていますがこの変数はインスタンス後にインスタンス変数になります。クラスに属するメソッドにインスタンスに属する変数が混ざるのでエラーになります。

Exception in thread "main" java.lang.Error: Unresolved compilation problem
static コンテキストでは this を使用できません

クラスに属するクラス変数なら使うことができます。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です