Java 覆盖不起作用



子类"testC.java中的方法不会覆盖超类"IMROBOS.java中的方法"我也没有收到任何错误或警告,但它们无法按预期工作。显示超类方法的输出,而不是子类方法的输出。如果我做错了什么,那么为什么我没有收到错误消息?一个类似的问题是关于stackoverflow的,它提到将方法更改为"受保护"是有效的,但在我的情况下并非如此。

另外,请告诉我我是否在testC中正确访问变量"roboKey".java?谢谢

我的超班"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);
    }
}

你只是在创建和使用超类的实例:

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

这就是不调用子类roboAction的原因。

如果需要调用子类的方法,请创建子类的实例:

public static IMROBOS IMRobos = new testC ();

顺便说一句,请使用 Java 命名约定(类名应大写,变量和方法名应使用驼峰大小写)。您的代码将更具可读性。

public static IMRobos iMRobos = new TestC ();

请参阅链接:https://en.wikipedia.org/wiki/Method_overriding

据说:

执行的方法的版本将由 用于调用它的对象。如果父类的对象是 用于调用该方法,则父类中的版本将 执行,但如果子类的对象用于调用 方法,则将执行子类中的版本。

对于名为IMRobos的变量,您分配了一个对象super classIMROBOS所以你得到了super class的行为,但如果你分配了sub class的对象,即 testC,你会得到sub class的行为。

最新更新