2016-11-16 6 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 файл ... и я хотел бы назвать, что Keypressed GymController.java файла метод ... так что объект перемещается, когда пользователь нажимает клавишу пробела. Как я могу связать эти два файла в первую очередь ...? Но компилятор дает мне ошибку, говоря, что он не может найти символ. Как я могу вызвать метод из другого .java-файла в метод keyPressed текущего файла правильно, чтобы он компилировался ...?

+0

Экземпляр переменной 'gym' НЕ инициализируется. Вы создаете новый объект «Gym» в методе begin. Удалите имя класса перед 'gym' в методе' begin() '. Это должно быть 'gym = new Gym (...)', а не 'Gym gym = new 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.run() не будет использовать тот же экземпляр тренажерного зала, что и тот, кто его создал. Если это было вашим намерением, вам необходимо передать ссылку this из тренажерного зала в спортзал.