【问题标题】:non-static variable this cannot be referenced from a static context非静态变量 this 不能从静态上下文中引用
【发布时间】:2013-04-04 10:45:37
【问题描述】:

错误来自这一行 BoardState addme = new BoardState();

由于某种原因,它指向的非静态变量是“新的”。我不清楚如何解决这个错误,因为 new 并不是一个变量,也不是。

查看stackoverflow记录,这个错误通常来自非静态方法,通常通过将方法设为静态或完全绕过方法来解决。 T

下面这段代码是为了参考这个语句前后发生的事情。

public class IntelligentTicTacToe extends TicTacToe {

public class BoardState{
    public String TTTState;
    public int[][] defensiveOppsArray;
    public int[][] offensiveOppsArray;
    public String str;
    public int cnt;
}

public static ArrayList<BoardState> memory = new ArrayList<BoardState>();


public static boolean makeMove(){
    char[] oArray = new char[TicTacToeArray.length];
    int[][] defensiveOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    int[][] offensiveOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    int[][] sumOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];
    //converts our Array into a String
    String x = convertTTTArrayToString();

    //Goes through the conditions to see if we have it in memory or if we must go through all the conditions
    boolean matchFound = false;
        for(int i=0; i < memory.size(); i++){
            BoardState element = memory.get(i);
            if(element.str.equals(x)){
                System.out.println("Match Found");
                matchFound = true;
            }}
        if(!matchFound){
        BoardState addme = new BoardState();
        addme.str = x;
        addme.cnt = 1;
        memory.add(addme);

        }

}....

【问题讨论】:

标签: java static non-static


【解决方案1】:

它不起作用的原因是因为您的类BoardStateIntelligentTicTacToe 内部的非静态类。这意味着当引用它时,您将引用该类的一个实例;该实例在静态上下文中不可用。

一种解决方案是将该类声明为:

public static class BoardState {

您可以阅读更多关于内部类的信息here

【讨论】:

  • 工作谢谢!最简单的解决方案。谢谢你的解释
【解决方案2】:

不要像现在这样嵌套类。没有必要,它要做的就是要求您在 IntelligentTicTacToe 实例之上创建一个 BoardState 对象,即,

BoardState addme = new IntelligentTicTacToe(). new BoardState();

但这不应该是您的程序的要求。

解决方案:将 BoardState 类放在它所属的位置,放在它自己的文件中。 或者将 BoardState 设为枚举,但它应该只保存常量。

【讨论】:

  • 否;就让它static
  • @SLaks:也可以。或者更好的是,让它成为一个枚举,然后它就会自动成为静态的。
  • 立即尝试您的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 2011-11-30
相关资源
最近更新 更多