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();
}
}
静的フィールドをグローバル変数のように用いることは、可読性を難しくし、好ましくないため上記の例はおススメしません。
一応、エラーは出ないという点で紹介しました。