วิธีการไม่คงที่ไม่สามารถอ้างอิงได้จากบริบทคงที่ (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(แถว, คอลัม); ดูเหมือนคงที่เพียงพอสำหรับฉัน คล้ายกันเพียงพอสำหรับ CV IMHO   -  person nanofarad    schedule 30.09.2013
comment
@hexafraction: ฉันไม่ได้บอกว่าเขาพูดถูก ฉันแค่บอกว่านั่นเป็นความตั้งใจของเขาที่จะถาม :)   -  person Dolda2000    schedule 30.09.2013


คำตอบ (3)


รหัสนั้นไม่ได้คอมไพล์ด้วยเหตุผลอื่น ตัวอย่างเช่น ใน Constructor นี้ ไม่ได้กำหนด startDir และแม้ว่าจะมีการกำหนดขนาดไว้ แต่ก็ไม่ได้ทำอะไรเลย มันกำหนดขนาดพารามิเตอร์ให้กับตัวมันเอง คุณต้องการสิ่งนี้จริงๆ 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 โดยคิดว่ามันจะถูกเรียกใช้บนอินสแตนซ์ของ floor ของ Ant แต่ มันรวบรวมราวกับว่ามันเป็นการอ้างอิงถึงวิธีการคงที่ นี่เป็นเพราะว่า floor ในที่นี้หมายถึงคลาส floor เอง แทนที่จะเป็นตัวแปรที่เก็บอินสแตนซ์ไว้

หากต้องการแก้ไข ให้สร้างตัวแปรอินสแตนซ์ floor ในคลาส Ant แทนที่จะสร้างเฉพาะในตัวสร้าง (แม้ว่าจะแนะนำภายใต้ชื่ออื่น เพื่อหลีกเลี่ยงความขัดแย้งในการตั้งชื่อมากขึ้น)

person Dolda2000    schedule 30.09.2013
comment
ตอบถูก! นอกจากนี้ OP ควรเปลี่ยนชื่อคลาสจาก floor เป็น Floor เพื่อให้สอดคล้องกับมาตรฐานการตั้งชื่อ Java - person musical_coder; 30.09.2013