subClass“testC.java中的方法不会覆盖superClass中的方法”IMROBOS.java“ 我也没有收到任何错误或警告,但它们没有按预期工作。 显示superClass方法的输出,而不是subClass中的输出。如果我做错了什么,为什么我没有收到错误消息? 类似的问题是关于stackoverflow,它提到将方法更改为“protected”有效,但不是我的情况。
另外,如果我在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);
}
}
答案 0 :(得分:1)
您只是创建和使用超类的实例:
public static IMROBOS IMRobos = new IMROBOS();
...
jframe.addKeyListener( IMRobos );
这就是没有调用子类roboAction
的原因。
如果您需要调用子类的方法,请创建子类的实例:
public static IMROBOS IMRobos = new testC ();
顺便说一下,请使用Java命名约定(类名应大写,变量和方法名称应使用驼峰大小写)。您的代码更具可读性。
public static IMRobos iMRobos = new TestC ();
答案 1 :(得分:0)
请参阅链接:https://en.wikipedia.org/wiki/Method_overriding
据说:
执行的方法版本将由 用于调用它的对象。如果父类的对象是 用于调用方法,然后父类中的版本将 执行,但如果使用子类的对象来调用 方法,然后将执行子类中的版本。
对于名为IMRobos
的变量,您指定了super class
的对象,即IMROBOS
,因此您获得了super class
的行为,但是如果您已分配了{{1}的对象即sub class
,您将获得testC
的行为。