java覆盖不起作用

时间:2016-05-30 08:49:59

标签: java

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);
    }
}

2 个答案:

答案 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的行为。