2016-11-16 11 views
-1

Gym.java왜 객체와 함께 클래스 메소드를 호출 할 수 없습니까?

public class Gym extends ActiveObject { 
    public void run() { 
     ... 
    } 
} 

GymController.java

public class GymController extends WindowController implements KeyListener{ 

    private Gym gym; 

    public void begin() { 
     Gym gym = new gym(canvas, new Location(dx, dy), delay, this); 
    } 

    public void keyPressed(KeyEvent e) { 
     int key = e.getKeyCode(); 

     if (key == KeyEvent.VK_SPACE) { 
      gym.run(); 
     } 
    } 
} 

객체와 Gym.java 파일의 이동 코드가있다 ... 나는 GymController.java 파일의의 keyPressed에 그에게 전화하고 싶어 메서드를 사용하여 사용자가 스페이스 바를 누를 때 객체가 움직입니다. 처음 두 파일을 어떻게 연결합니까? ...? 하지만 컴파일러에서 기호를 찾을 수 없다는 오류가 발생했습니다. 다른 .java 파일의 메서드를 현재 파일의 keyPressed 메서드로 제대로 호출하여 컴파일 할 수있는 방법은 무엇입니까?

+0

인스턴스 변수'gym'은 초기화되지 않습니다. begin 메소드에서 새로운'Gym' 객체를 생성하고 있습니다. 'begin()'메소드에서'gym' 전에 클래스 이름을 제거하십시오. '체육관 = 새로운 체육관 (...)'이 아니라 '체육관 = 새로운 체육관 (...)'이어야합니다. – progyammer

+1

우선 : '새로운 체육관'대신 '새로운 체육관' –

답변

1

으로 댓글 지적, 문제가에 달려있다 :

public void begin() { 
    Gym gym = new gym(canvas, new Location(dx, dy), delay, this); 
} 

그리고 그것은해야한다 : 모든

public void begin() { 
    gym = new Gym(canvas, new Location(dx, dy), delay, this); 
} 

첫째, 새로운 당신이 실제 객체를 구축하고, 클래스 이름을 사용 "패턴"에서. 그런 다음 Gym gym =...을 수행하면 begin() 메소드의 범위 내에서 로컬 변수가 만들어집니다. 그것은 시작부터 돌아 오면 폐기 될 것입니다. gym 또는 this.gym을 방금 사용하면 새 인스턴스가 멤버 변수에 할당됩니다.

하지만 처음의 gym 인스턴스는 새로운 gym 컨트롤러 인스턴스를 만들고, 다시 새로운 gym 인스턴스를 만듭니다. 그래서 gym.run()은 그것을 만든 사람과 같은 체육관을 사용하지 않을 것입니다. 그게 당신의 의도라면, 체육관에서 체육관으로 this 참조를 전달해야합니다.