多态性和覆盖方法:Eclipse 有一个错误?

Polymorphism and overriden methods: Eclipse has a bug?

这是一个元问题,所以不是我不懂多态。

假设您有一个 class 及其超级 class。

超级class有一个方法print,它打印出"Super"。 sub class 覆盖了它打印出来的这个方法 "Sub".

如果您创建两个实例,一个声明为超级 class,另一个为实际 class。

SuperClass superClass = new SubClass();
SubClass subClass = new SubClass();

现在,如果您使用 Eclipse,如果您键入 superClass。然后按 ctrl+space,在 Eclipse 的列表中,print 方法属于 SuperClass。 如果你对子类做同样的事情,eclipse推荐使用子类的print方法。

如果你简单地使用:

 superClass.print();
 subClass.print();

那么,输出当然是:SubSub。应该的。

您认为这是 Eclipse 中的错误吗?或者对此有解释吗?谢谢!

当您在超类上按 ctrl space 时,我们如何期望 IDE 识别您为哪个子类分配了变量。

如果你有两个 sub class 用于一个 super class,你希望它显示两个 sub class 的所有方法吗?

如果不是最终结果会怎样? 如果它是一个 class 级别变量,其中 IDE 无法确定在那个执行点,持有哪个子 class 实例会发生什么。

如果您需要来自 sub class 的方法,则添加一个实例检查,键入 cast 并说 ctrl space。

将代码完成视为在 静态视图 上工作,编译器也采用相同的视图:在 superClass. 之后完成让您添加 print() 因为 SuperClass 有一个方法 print()。在 SuperClass 中看到 print() 确保可以评估 superClass.print()

此视图不同于 运行时视图(您的程序实际执行的操作),其中 JVM 将找到 SubClass 的实例并通过动态绑定调用print().

的子 class 版本

编辑器、补全和编译器使用静态视图。如果您对运行时视图感兴趣,通常会使用调试器。作为中间道路,您可以 select 任何方法调用并按 Ctrl+T,这会为您提供可能在运行时通过此方法调用调用的所有实现的列表。但是调试器肯定会告诉你,运行时实际调用的是哪个版本。