2016-11-16 5 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にそれを呼び出すために望んでいましたメソッド...ユーザがスペースバーを押したときにオブジェクトが動くようにします。 これらの2つのファイルを最初にリンクするにはどうすればよいですか? しかし、コンパイラは私に記号を見つけることができないというエラーを出しています。 別の.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.run()はジムを作成したインスタンスと同じインスタンスを使用しません。それがあなたの意図だった場合は、thisの参照をgymからgymcontrollerに渡す必要があります。

関連する問題