这是一个元问题,所以不是我不了解多态性。
假设你有一个类及其超类。
超类有一个方法 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中的一个错误吗?或者对此有解释?谢谢!
答案 0 :(得分:1)
将代码完成视为处理静态视图,编译器也采用相同的视图:在superClass.
之后完成允许您添加print()
因为SuperClass有一个方法print()。查看print()
中的SuperClass
可确保superClass.print()
可以评估。
此视图不同于运行时视图(您的程序实际执行的操作),JVM将在其中找到SubClass
的实例,并通过动态绑定调用{的子类版本{1}}。
编辑器,完成和编译器使用静态视图。如果您对运行时视图感兴趣,通常使用调试器。作为中间道路,您可以选择任何方法调用并按print()
,这将为您提供可能在运行时通过此方法调用调用的所有实现的列表。但是,调试器肯定会告诉你,实际上将在运行时调用哪个版本。
答案 1 :(得分:0)
当你在superClass上ctrl空间时,我们怎么能期望IDE识别你为哪个SubClass分配了变量。
如果你有一个超类的两个子类,你期望它显示两个子类的所有方法。
如果不是最终会发生什么? 如果它是一个类级变量会发生什么,IDE无法确保在该执行点,哪个子类实例被保留。
如果你需要来自子类的方法,那么添加一个实例检查,输入cast并说出ctrl space。