无法从静态上下文(Java)引用非静态方法

无法从静态上下文(Java)引用非静态方法,java,static,non-static,Java,Static,Non Static,我对编程比较新,并且在从ant类调用floor类时,不断获得无法从静态上下文引用的非静态方法。我已经删除了所有的静态数据,仍然会出现这个错误,如果有人能给我指出正确的方向,或者让我知道问题是什么,那就太好了,谢谢 public class Ant { public final int RED = 0, BLUE = 1, NORTH = 0, EAST = 1, SOUTH = 2, WEST = 3; public int color; p

我对编程比较新,并且在从ant类调用floor类时,不断获得无法从静态上下文引用的非静态方法。我已经删除了所有的静态数据,仍然会出现这个错误,如果有人能给我指出正确的方向,或者让我知道问题是什么,那就太好了,谢谢

public class Ant {

    public final int RED = 0, BLUE = 1, NORTH = 0, 
            EAST = 1, SOUTH = 2, WEST = 3;
    public int color;

    public Ant(int size, int dir) {  
        size = size;
        dir = startDir;
        floor floor = new floor(size);
    }

    public int getRow() {
       return row; 
    }

    public int getCol() {
        return col;
    }

    public void makeMoves(int numMoves, int dir) {
        final int[][] offSet = {/* NORTH  */ {-1, 0},
                               /* EAST   */  {0, 1},
                               /* SOUTH  */  {1, 0},
                               /* WEST   */  {0,-1}};

        final int[][] newDir = {/* NORTH  */ {WEST, EAST},
                               /* EAST   */  {NORTH, SOUTH},
                               /* SOUTH  */  {EAST, WEST},
                               /* WEST   */  {SOUTH, NORTH}};
        //set start row, col, and direction
        row = col = size/2;

        for(int move = 1; move <= numMoves; move ++) {
            //make a move based on direction
            row = row + offSet[dir][0];
            col = col + offSet[dir][1];

            //turn based on color of new tile and direction
            color = floor.getTileColor(row, col);
            dir = newDir[dir][color];

            //change color of current tile
            floor.changeTileColor(row, col);
        }      
    }//End of makeMoves
}//End Ant class

public class floor {    
    int [][] grid;

    public floor(int size) {
        grid = new int[size][size];
    }

    public int getTileColor(int row, int col) {
        return grid[row][col];
    }

    public void changeTileColor(int row, int col) {
        int color = grid[row][col];
    }
}
公共类蚂蚁{
公共最终整数红色=0,蓝色=1,北部=0,
东=1,南=2,西=3;
公共int颜色;
公共蚂蚁(int-size,int-dir){
大小=大小;
dir=startDir;
地板=新地板(尺寸);
}
public int getRow(){
返回行;
}
公共int getCol(){
返回列;
}
公共void makeMoves(int numMoves,int dir){
最终int[][]偏移量={/*NORTH*/{-1,0},
/*东*/{0,1},
/*南方*/{1,0},
/*西*/{0,-1}};
最终int[][]newDir={/*北*/{西,东},
/*东*/{北,南},
/*南*/{东,西},
/*西*/{南,北};
//设置起始行、列和方向
行=列=大小/2;

对于(int move=1;move,该代码由于其他原因无法编译。例如,在此构造函数中,未定义startDir。虽然定义了大小,但这不起任何作用。它将参数大小分配给自身。您确实需要此参数。size=size

public Ant(int size, int dir)
    {  
        size = size;
        dir = startDir;

另外,行和列在任何地方都没有定义。如果您在静态方面遇到错误,我想知道您是否在编译旧代码。

该代码由于其他原因没有编译。例如,在此构造函数中,没有定义startDir。虽然定义了大小,但这不起任何作用。它会将参数大小分配给自身。您真的希望这个。大小=大小

public Ant(int size, int dir)
    {  
        size = size;
        dir = startDir;

另外,行和列在任何地方都没有定义。如果您在静态方面遇到错误,我想知道您是否在编译旧代码。

publicstaticvoidmain()
是一个静态上下文。它只有一个,而从技术上讲有一个是
makeMoves()
,例如,对于每个
Ant
对象。在
Ant
的实例上调用它们,或者使它们也成为
静态的
。这就是要点,只需查找关键字
static
,和/或上下文,即可了解更多信息。

公共静态void main()
是一个静态上下文。它只有一个,而从技术上讲,只有一个
makeMoves()
,例如,对于每个
Ant
对象。在
Ant
的实例上调用它们,或者让它们也成为
静态的
。这就是要点,只需查找关键字
static
,和/或上下文,就可以了解更多信息。

正如其他人所指出的,您正在编译的代码似乎与您发布的代码不匹配,因为posted代码包含除静态访问之外的其他错误

然而,我认为你的基本问题(至少就它所提出的问题而言)你认为你已经在
Ant
类中为地板定义了一个实例变量,而实际上你没有。你只是在
Ant
构造函数中为它定义了一个局部变量,一旦构造函数返回,它就会被丢弃

然后,由于
floor
类本身与您可能认为是保持Ant的floor的变量之间存在命名冲突,因此您尝试调用
floor.changeTileColor
,认为它将在Ant的floor实例上调用,但它编译时就像是对静态方法的引用一样。这是因为这里的
floor
指的是类
floor
本身,而不是包含实例的变量


要解决此问题,请在
Ant
类中创建一个
floor
实例变量,而不是仅在构造函数中创建一个实例变量(不过,建议使用另一个名称,以避免更多命名冲突).

正如其他人所指出的,您正在编译的代码似乎与您发布的代码不匹配,因为发布的代码包含除静态访问之外的其他错误

然而,我认为你的基本问题(至少就它所提出的问题而言)你认为你已经在
Ant
类中为地板定义了一个实例变量,而实际上你没有。你只是在
Ant
构造函数中为它定义了一个局部变量,一旦构造函数返回,它就会被丢弃

然后,由于
floor
类本身与您可能认为是保持Ant的floor的变量之间存在命名冲突,因此您尝试调用
floor.changeTileColor
,认为它将在Ant的floor实例上调用,但它编译时就像是对静态方法的引用一样。这是因为这里的
floor
指的是类
floor
本身,而不是包含实例的变量


要解决此问题,请在
Ant
类中创建一个
floor
实例变量,而不是仅在构造函数中创建一个实例变量(不过,建议使用另一个名称,以避免更多命名冲突).

哪一行出现错误?请显示导致错误的代码行。@hexafraction:我觉得不是这样。他问这个问题似乎是因为他认为自己没有任何静态代码,而不是因为他想知道为什么不能从静态代码调用非静态代码。@Dolda2000 floor.changeTileColor(row,col);对我来说似乎是静态的。对CV IMHO来说也足够了。@hexafraction:我不是说他是对的,我只是说这是他问的意图。:)哪一行出现了错误?请显示导致错误的代码行。@hexafraction:对我来说似乎不是这样。他似乎是在问,因为他是这样做的