2016-05-30 12 views
1

サブクラス "testC.java"のメソッドは、 "IMROBOS.java"というスーパークラスのメソッドをオーバーライドしません。 エラーや警告は表示されませんが、期待どおりに機能しません。 superClassメソッドの出力は、サブクラスのものではなく、表示されます。何か間違っていると、なぜエラーメッセージが表示されませんか? 同様の質問がstackoverflowにありました。私の場合で働いていた「保護」ではなく、またjavaオーバーライドが機能しない

、私はtestC.javaに正しく変数「roboKey​​」にアクセスしていますか?教えて おかげください

私のスーパー "IMROBOS.java"

import java.awt.event.*; 
class IMROBOS extends KeyAdapter { 
    public int roboKey; 
    public char roboKeyChar; 
    @Override 
    public void keyPressed(KeyEvent event) { 
     roboKeyChar = event.getKeyChar(); 
     roboKey = event.getKeyCode(); 
     roboAction(roboKey); 
    } 

    protected void roboAction(int k){ 
     System.out.println(roboKey); 
    } 

} 

マイサブクラス "testC.java":

import java.awt.event.KeyEvent; 
class testC extends IMROBOS { 
    public static IMROBOS IMRobos = new IMROBOS(); 
    @Override 
    protected void roboAction(int k){ 
     System.out.println(" SubClass: " + IMRobos.roboKey + " | " + k + " | " + IMRobos.roboKeyChar); 
    } 

    public static void main(String[] a){ 
     JFrame jframe = new JFrame(); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.addKeyListener(IMRobos); 
     jframe.setSize(400, 350); 
     jframe.setVisible(true); 
    } 
} 

答えて

1

あなたが唯一のスーパークラスのインスタンスを作成し、使用している:

public static IMROBOS IMRobos = new IMROBOS(); 
... 
jframe.addKeyListener(IMRobos); 

これは、サブクラスのroboActionが呼び出されない理由です。

あなたが呼ばれるサブクラスのメソッドが必要な場合は、サブクラスのインスタンスを作成します。

public static IMROBOS IMRobos = new testC(); 

ところで、Javaの命名規則(クラス名は大文字する必要があり、変数やメソッド名を使用してくださいキャメルケースを使用する必要があります)。あなたのコードは読みやすくなります。

public static IMRobos iMRobos = new TestC(); 
0

リンクをご覧ください:https://en.wikipedia.org/wiki/Method_overriding

それは言われている。

それを呼び出すために使用される オブジェクトによって決定されますが実行される方法のバージョン。親クラスのオブジェクトが メソッドの呼び出しに使用されている場合、親クラスのバージョンは になりますが、サブクラスのオブジェクトを使用して メソッドを呼び出すと、子クラスのバージョンは実行される。 IMRobosあなたがそうあなたがsuper classの振る舞いを持っていますが、sub classすなわちtestCのオブジェクトが割り当てられていた場合、あなたはsub classの振る舞いを持っているでしょう。super classすなわちIMROBOSのオブジェクトを割り当てるという名前の変数に

関連する問題