gpt4 book ai didi

java - 覆盖 Java 方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:29 24 4
gpt4 key购买 nike

我是 Java 的新手,我已经阅读了一些关于重写方法的教程,但是我正在查看的示例并没有按我预期的方式工作。例如,我有代码:

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

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

编辑:是的,这些类在两个单独的文件中。为简洁起见,它们一起显示。

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

编辑:关于第三方程序的更多信息。它从调用 A.main() 开始,我最初没有展示它(抱歉)。我假设我需要制作“new A().run();”更通用地使用当前类的名称。这可能吗?

最佳答案

如果您执行以下操作,该代码将输出 B:

(new B()).run();

无论问题是什么,它都不在您引用的代码中。

已更新(在您编辑之后)

如果第三方程序正在调用 A.main(),您在 B 中无法(合理地)执行任何将自身注入(inject) A 的操作。只要 A.main 正在执行 new A().run(),它就会有一个 A 的实例,而不是一个实例B。没有“当前类名”可供使用,或者如果有(取决于您的观点),它是 A,而不是 B

你必须让第三方程序以某种方式调用B,而不是A,或者只是修改A直接(例如,完全摆脱 B)。您不想修改A以使其使用B;将它紧紧地绑定(bind)到一个后代上,并使它们之间的分离在很大程度上毫无意义。

希望对您有所帮助。

关于java - 覆盖 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2154802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com