2016-05-30 69 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 classIMROBOS的對象,以便你得到的super class的行爲,但如果你已經分配的sub classtestC對象,你會得到的sub class行爲。