На нестатический метод нельзя ссылаться из статического контекста (Java)

Я новичок в программировании и продолжаю получать нестатический метод, на который нельзя ссылаться из статического контекста при вызове моего класса пола из моего класса муравьев. Я удалил всю статику и все еще получаю эту ошибку, если бы кто-нибудь мог указать мне в правильном направлении или сообщить, в чем проблема, было бы здорово, спасибо.

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];
    }
}

person Tessa Olowniuk    schedule 29.09.2013    source источник
comment
В какой строке выдается ошибка?   -  person ssantos    schedule 30.09.2013
comment
Покажите строку кода, которая вызывает ошибку.   -  person Code-Apprentice    schedule 30.09.2013
comment
@hexafraction: Мне так не кажется. Кажется, он спрашивает, потому что не думает, что у него есть статический код, а не потому, что ему интересно, почему он не может вызвать нестатический код из статического кода.   -  person Dolda2000    schedule 30.09.2013
comment
@ Dolda2000 floor.changeTileColor (row, col); мне кажется достаточно статичным. Достаточно Simialr для CV ИМХО.   -  person nanofarad    schedule 30.09.2013
comment
@hexafraction: Я не говорю, что он был прав, я просто сказал, что он хотел спросить. :)   -  person Dolda2000    schedule 30.09.2013


Ответы (3)


Этот код не компилируется по другим причинам. Например, в этом конструкторе startDir не определен. И хотя размер определен, это ничего не дает. Он присваивает себе размер параметра. Вам действительно нужен this.size = size;

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

Кроме того, строки и столбцы нигде не определены. Если вы получаете ошибки относительно статики, мне интересно, компилируете ли вы старый код.

person Jeanne Boyarsky    schedule 29.09.2013

public static void main() - статический контекст. Есть только один из них, тогда как технически есть один из makeMoves(), скажем, для каждого Ant объекта. Вызовите их на экземпляре Ant или также сделайте их static. В этом суть, просто найдите ключевое слово static и / или контекст, чтобы узнать больше.

person clwhisk    schedule 29.09.2013

Как отмечали другие, код, который вы компилируете, похоже, не соответствует опубликованному вами коду, потому что опубликованный код содержит другие ошибки, чем просто статический доступ.

Однако я думаю, что ваша основная проблема (по крайней мере, в том, что касается поставленного вопроса), заключается в том, что вы думаете, что вы определили переменную экземпляра в классе Ant для этажа, хотя на самом деле это не так. Вы только что определили для него локальную переменную в конструкторе Ant, которая отбрасывается, как только конструктор возвращается.

Затем, поскольку у вас есть конфликт имен между самим классом floor и тем, что вы, вероятно, думаете, является переменной, которая будет содержать пол Ant, вы пытаетесь вызвать floor.changeTileColor, думая, что он будет вызываться в экземпляре пола Ant, но он компилируется, как если бы это была ссылка на статический метод. Это потому, что здесь floor относится к самому классу floor, а не к переменной, содержащей его экземпляр.

Чтобы решить эту проблему, создайте переменную экземпляра floor в классе Ant, а не только в конструкторе (хотя, предположительно, под другим именем, чтобы избежать конфликтов имен).

person Dolda2000    schedule 30.09.2013
comment
Правильный ответ! Кроме того, OP должен изменить имя класса с этажа на этаж, чтобы соответствовать стандартам именования Java. - person musical_coder; 30.09.2013