2013-09-29 4 views
0

저는 프로그래밍에 익숙하지 않고 앤티 클래스에서 내 바닥 클래스를 호출 할 때 비 정적 메서드를 정적 컨텍스트에서 참조 할 수 없도록합니다. 누군가가 올바른 방향으로 나를 가리킬 수 또는 문제가 될 것이라고 알려주면 모든 정적을 제거하고 여전히이 오류가 발생했습니다. 감사합니다.정적 컨텍스트 (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]; 
    } 
} 
+2

어떤 줄에서 오류가 발생합니까? – ssantos

+0

오류의 원인이되는 코드 줄을 표시하십시오. –

+0

@ hexafraction : 그것은 나에게 그렇게 보이지 않습니다. 그가 정적 코드를 가지고 있다고 생각하지 않기 때문에 묻는 것 같습니다. 왜 정적 코드에서 비 정적 코드를 호출 할 수 있는지 궁금해하지 않기 때문이 아닙니다. – Dolda2000

답변

1

다른 이유로 코드가 컴파일되지 않습니다. 예를 들어,이 생성자에서 startDir은 정의되지 않습니다. 크기가 정의되어 있지만 아무 것도하지 않습니다. 매개 변수 크기를 자체에 할당합니다. 정말로 this.size = size;를 원한다.

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

또한 행과 열은 어디에도 정의되어 있지 않습니다. 정적에 대한 오류가 발생하는 경우 이전 코드를 컴파일하고 있는지 궁금합니다.

1

public static void main()은 정적 컨텍스트입니다. 그 중 하나만 있는데, 기술적으로는 Ant 개체 각각에 대해 makeMoves() 중 하나가 있습니다. Ant의 인스턴스에서 호출하거나 static으로 만들 수도 있습니다. 그것은 요점, 키워드를 찾으십시오. static 및/또는 컨텍스트, 범위 더 알아보십시오.

1

게시 된 코드에 정적 액세스 이외의 다른 오류가 포함되어 있기 때문에 컴파일하는 코드가 게시 된 코드와 일치하지 않는 것으로 지적 된 점이 있습니다.

그러나 기본 문제는 적어도 바닥에 대해 Ant 클래스의 인스턴스 변수를 정의했다고 생각한다는 것입니다. 실제로는 그렇지 않습니다. Ant 생성자에서 방금 지역 변수를 정의했습니다. 생성자가 반환 되 자마자 폐기됩니다.

그런 다음 floor 클래스 자체와 Ant의 바닥을 유지할 변수라고 생각되는 이름 지정 충돌이 있으므로 floor.changeTileColor을 호출하려고합니다.이 인스턴스는 Ant의 인스턴스에서 호출 될 것이라고 생각합니다. 하지만 정적 메서드에 대한 참조 인 것처럼 컴파일됩니다. 이는 여기에 floor이 인스턴스를 보유하는 변수가 아닌 floor 클래스를 참조하기 때문입니다.

해결하려면 더 많은 명명 충돌을 피하기 위해 Ant 클래스의 인스턴스 변수를 생성자 대신 (다른 이름으로 지정하는 것이 좋습니다) floor 클래스로 만듭니다.

+0

정답! 또한 운영자는 Java 명명 표준을 준수하도록 클래스의 이름을 바닥에서 바닥으로 변경해야합니다. –