【Java】error: non-static variable this cannot be referenced from a static context 解決方法

non-static variable this cannot be referenced from a static contextの解決方法を紹介します。

静的メンバとは

このエラーを解決するには、静的メンバを理解する必要があります。

静的メンバについては、別記事に紹介しています。

原因

静的メンバを理解した上で話を進めます。

このエラーは、静的メソッドに通常のメンバ(ここでは、thisから始まるフィールド)を利用していることが原因です。

なぜこれが問題かというと、メンバは、インスタンスを生成して利用できます。

一方、静的メンバは、特別にインスタンスを生成なしで利用可能です。

インスタンスせずに通常のメンバは、利用できませんので、エラーになります。

具体例

public class Greet{
    public String lang="en"; //フィールド
    public static void Hello(){ //静的メソッド
        System.out.println(this.lang); //エラー(フィールドを利用)
    };
}
public class Main{
    public static void main(String [] args){
        Greet.Hello();
    }
}

解決方法

静的メソッドではなく、メソッドとして利用する

具体例

public class Greet{
    public String lang="en"; //静的フィールド
    public void Hello(){  //静的メソッド
        System.out.println(this.lang);
    };
}
public class Main{
    public static void main(String [] args){
        Greet g = new Greet(); //インスタンスを生成
        g.Hello();
    }
}

静的メソッド内に通常のメンバを利用しない

具体例

public class Greet{
    public static String lang="en"; //静的フィールド
    public static void Hello(){  //静的メソッド
        System.out.println(lang);
    };
}
public class Main{
    public static void main(String [] args){
        Greet.Hello();
    }
}

静的フィールドをグローバル変数のように用いることは、可読性を難しくし、好ましくないため上記の例はおススメしません。

一応、エラーは出ないという点で紹介しました。