覆盖Java方法

Cer*_*rin 5 java overriding

我是Java的新手,我已经阅读了一些有关重写方法的教程,但我看到的一个例子并不像我期望的那样工作.例如,我有代码:

public class A{
    public void show(){
        System.out.println("A");
    }
    public void run(){
        show();
    }
    public static void main( String[] arg ) {
        new A().run();
    }
}
Run Code Online (Sandbox Code Playgroud)
public class B extends A{
    @Override
    public void show(){
        System.out.println("B");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我实例化并调用B.run()时,我希望看到"B"输出.但是,我看到了"A".我究竟做错了什么?

编辑:是的,这些类分为两个单独的文件.他们为了简洁而一起展示.

编辑:我不确定B是如何被实例化的,因为它是由使用类加载器的第三方程序完成的.

编辑:有关第三方程序的更多信息.它首先调用A.main(),我最初没有显示(抱歉).我假设我需要制作"new A().run();" 更通用的使用当前类的名称.那可能吗?

T.J*_*der 6

该代码将输出B,如果你:

(new B()).run();
Run Code Online (Sandbox Code Playgroud)

无论问题是什么,都不在你引用的代码中.

更新(编辑后)

如果第三方程序正在调用A.main(),则没有任何(合理的)可以执行B此操作A.只要A.main是做new A().run(),这将有实例A,而不是一个实例B.没有"当前的类名"可以使用,或者如果有(取决于你的观点),它A不是B.

您必须以B某种方式调用第三方程序,而不是直接A修改A(例如,B完全删除).你不是要修改A,以使其使用B; 它将它与后代紧密联系起来,使它们之间的分离毫无意义.

希望有所帮助.