0

我是编程新手,并且在从我的 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];
    }
}
4

3 回答 3

1

正如其他人指出的那样,您正在编译的代码似乎与您发布的代码不匹配,因为发布的代码包含其他错误,而不仅仅是静态访问。

但是,我认为您的基本问题(至少考虑到提出的问题)是您认为您已经Ant在 floor 的类中定义了一个实例变量,而实际上您没有。您刚刚在构造函数中为其定义了一个局部变量,Ant一旦构造函数返回,该变量就会被丢弃。

floor然后,由于你在类本身和你可能认为是保持 Ant 楼层的变量之间存在命名冲突,你试图调用floor.changeTileColor,认为它将在 Ant 的 floor 实例上调用,但它编译好像它是对静态方法的引用。这是因为floor在这里,指的是类floor本身,而不是一个持有它实例的变量。

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

于 2013-09-30T00:09:47.760 回答
1

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

于 2013-09-29T23:12:00.973 回答
1

该代码由于其他原因无法编译。例如,在此构造函数中,未定义 startDir。虽然定义了大小,但这并没有做任何事情。它将参数大小分配给自身。你真的想要 this.size = size;

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

此外, row 和 col 没有在任何地方定义。如果您遇到有关静态的错误,我想知道您是否正在编译旧代码。

于 2013-09-29T22:45:55.010 回答