2016-05-30 17 views
1

Die Methode in der Unterklasse "testC.java überschreibt nicht die Methode in der Superklasse" IMROBOS.java " Ich bekomme auch keine Fehler oder Warnungen, aber sie funktionieren nicht wie erwartet. Die Ausgabe der superClass-Methode wird angezeigt, und nicht der in der Unterklasse.Wenn ich etwas falsch mache, warum bekomme ich keine Fehlermeldungen? Eine ähnliche Frage war auf Stackoverflow und es erwähnt, dass Methoden zu ändern „geschützt“ gearbeitet, aber nicht in meinem Fall.Java Overriding funktioniert nicht

auch mir bitte sagen, ob ich die Variable „roboKey“ korrekt in dem testC.java ich zugreifen? Dank

My Super "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); 
    } 

} 

Mein Subklasse "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); 
    } 
} 

Antwort

1

Sie nur das Erstellen und Verwenden einer Instanz der Superklasse:

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

Das ist der Grund, warum die Unterklasse roboAction nicht aufgerufen wird.

Wenn Sie die Unterklasse Methode erfordert aufgerufen werden, eine Instanz der Unterklasse erstellen:

public static IMROBOS IMRobos = new testC(); 

BTW, benutzen Sie bitte Java Namenskonventionen (Klassennamen groß geschrieben werden sollte und variable und Methodennamen sollte camel case verwenden). Ihr Code wäre besser lesbar.

public static IMRobos iMRobos = new TestC(); 
0

Bitte beachten Sie den Link: https://en.wikipedia.org/wiki/Method_overriding

Es wird gesagt, dass:

Die Version eines Verfahrens, das durch die Objekt wird bestimmt ausgeführt wird, das verwendet wird, um es aufzurufen. Wenn ein Objekt einer übergeordneten Klasse zum Aufrufen der Methode verwendet wird, wird die Version in der übergeordneten Klasse ausgeführt. Wenn jedoch ein Objekt der Unterklasse zum Aufrufen der -Methode verwendet wird, wird die Version in der untergeordneten Klasse verwendet ausgeführt werden.

Zum Variable mit dem Namen IMRobos Ihnen zugewiesen ein Objekt von super class heißt IMROBOS, so dass Sie das Verhalten von super class bekam aber wenn Sie das Objekt von sub class heißt testC zugewiesen hatte, würden Sie das Verhalten von sub class bekommen haben.