多态和覆盖方法:Eclipse有一个bug?

时间:2015-03-08 02:31:53

标签: eclipse polymorphism override

这是一个元问题,所以不是我不了解多态性。

假设你有一个类及其超类。

超类有一个方法 print ,它打印出来" Super"。 子类重写它打印出的方法" Sub"。

如果你创建了两个实例,一个被声明为超类,另一个被称为实际类。

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

现在,如果您使用Eclipse,则键入superClass。并在Eclipse列表中点击ctrl + space, print 方法属于SuperClass。 如果你对subClass做同样的事情,eclipse推荐使用SubClass的 print 方法。

如果您只是使用:

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

然后,当然输出将是:SubSub。应该如此。

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

2 个答案:

答案 0 :(得分:1)

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

此视图不同于运行时视图(您的程序实际执行的操作),JVM将在其中找到SubClass的实例,并通过动态绑定调用{的子类版本{1}}。

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

答案 1 :(得分:0)

当你在superClass上ctrl空间时,我们怎么能期望IDE识别你为哪个SubClass分配了变量。

如果你有一个超类的两个子类,你期望它显示两个子类的所有方法。

如果不是最终会发生什么? 如果它是一个类级变量会发生什么,IDE无法确保在该执行点,哪个子类实例被保留。

如果你需要来自子类的方法,那么添加一个实例检查,输入cast并说出ctrl space。