Metode non-statis tidak dapat direferensikan dari konteks statis (Java) [duplikat]

Saya lebih baru dalam pemrograman dan terus mendapatkan metode non-statis tidak dapat direferensikan dari konteks statis ketika memanggil kelas lantai saya dari kelas semut saya. Saya telah menghapus semua statika dan masih mendapatkan kesalahan ini, jika seseorang dapat mengarahkan saya ke arah yang benar atau memberi tahu saya apa masalahnya, itu akan sangat bagus, terima kasih.

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 sumber
comment
Baris mana yang memberikan kesalahan?   -  person ssantos    schedule 30.09.2013
comment
Tolong tunjukkan baris kode yang menyebabkan kesalahan.   -  person Code-Apprentice    schedule 30.09.2013
comment
@hexafraction: Bagi saya sepertinya tidak seperti itu. Dia sepertinya bertanya karena menurutnya dia tidak memiliki kode statis, bukan karena dia bertanya-tanya mengapa dia tidak dapat memanggil kode non-statis dari kode statis.   -  person Dolda2000    schedule 30.09.2013
comment
@Dolda2000 floor.changeTileColor(baris, kolom); tampaknya cukup statis bagi saya. Cukup mirip untuk CV IMHO.   -  person nanofarad    schedule 30.09.2013
comment
@hexafraction: Saya tidak mengatakan dia benar, saya hanya mengatakan bahwa dia bermaksud bertanya. :)   -  person Dolda2000    schedule 30.09.2013


Jawaban (3)


Kode itu tidak dapat dikompilasi karena alasan lain. Misalnya, dalam konstruktor ini, startDir tidak ditentukan. Dan meskipun ukuran sudah ditentukan, itu tidak menghasilkan apa-apa. Ini menetapkan ukuran parameter untuk dirinya sendiri. Anda benar-benar menginginkan this.size = size;

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

Selain itu, baris dan kolom tidak ditentukan di mana pun. Jika Anda mendapatkan kesalahan tentang statika, saya ingin tahu apakah Anda sedang mengkompilasi kode lama.

person Jeanne Boyarsky    schedule 29.09.2013

public static void main() adalah konteks statis. Hanya ada satu, sedangkan secara teknis ada satu dari makeMoves(), katakanlah, untuk setiap Ant objek. Panggil mereka pada contoh Ant, atau jadikan mereka static juga. Itulah intinya, cukup cari kata kunci static, dan/atau konteks, cakupannya untuk mempelajari lebih lanjut.

person clwhisk    schedule 29.09.2013

Seperti yang ditunjukkan orang lain, kode yang Anda kompilasi tampaknya tidak cocok dengan kode yang Anda posting, karena kode yang diposting mengandung kesalahan lain selain akses statis.

Namun, menurut saya masalah mendasar Anda (setidaknya sehubungan dengan pertanyaan yang diajukan) adalah Anda mengira Anda telah mendefinisikan variabel instan di kelas Ant untuk lantai, padahal sebenarnya belum. Anda baru saja mendefinisikan variabel lokal untuk variabel tersebut di konstruktor Ant, yang akan dibuang segera setelah konstruktor kembali.

Kemudian, karena Anda memiliki konflik penamaan antara kelas floor itu sendiri dan apa yang mungkin Anda anggap sebagai variabel yang akan menampung lantai Semut, Anda mencoba memanggil floor.changeTileColor, berpikir bahwa itu akan dipanggil pada contoh lantai Semut, tetapi itu dikompilasi seolah-olah itu adalah referensi ke metode statis. Hal ini karena floor, di sini, mengacu pada kelas floor itu sendiri dan bukan pada variabel yang memiliki instance di dalamnya.

Untuk mengatasinya, buatlah variabel instance floor di kelas Ant, bukan hanya di konstruktor (meskipun, disarankan, dengan nama lain, untuk menghindari lebih banyak konflik penamaan).

person Dolda2000    schedule 30.09.2013
comment
Jawaban benar! Selain itu, OP harus mengubah nama kelas dari lantai menjadi Lantai agar sesuai dengan standar penamaan Java. - person musical_coder; 30.09.2013