java中同名的两个方法
我注意到,如果我有两个同名的方法,第一个接受java中同名的两个方法,java,methods,extends,Java,Methods,Extends,我注意到,如果我有两个同名的方法,第一个接受SomeObject,第二个接受扩展SomeObject的对象,当我用SomeOtherObject调用该方法时,它会自动使用只接受SomeObject的方法。如果我将SomeOtherObject强制转换为SomeObject,则会使用接受SomeObject的方法,即使该对象是SomeOtherObject的实例。这意味着在编译时选择了该方法。为什么?这就是Java中方法重载解析的工作原理:方法是在编译时选择的 有关所有丑陋的细节,请参见 这意味着
SomeObject
,第二个接受扩展SomeObject
的对象,当我用SomeOtherObject
调用该方法时,它会自动使用只接受SomeObject
的方法。如果我将SomeOtherObject
强制转换为SomeObject
,则会使用接受SomeObject
的方法,即使该对象是SomeOtherObject
的实例。这意味着在编译时选择了该方法。为什么?这就是Java中方法重载解析的工作原理:方法是在编译时选择的
有关所有丑陋的细节,请参见
这意味着在编译时选择了该方法
是的,你是对的。这就是它的意思
为什么?
我能想到他们这样设计Java的四个原因:
- 这与其他支持重载的静态类型OO语言的工作方式是一致的。这就是来自C++世界的人们所期待的。(在Java的早期,这一点特别重要……尽管现在不那么重要。)。值得注意的是,C#以同样的方式处理重载
- 它是高效的。在运行时解析方法重载(基于实际参数类型)会使重载方法调用变得昂贵
- 它提供了更可预测(因此更容易理解)的行为
- 它避免了脆弱的基类问题,即在基类中添加新的重载方法会导致现有派生类出现意外问题
有关更多详细信息,您可以在Java规范中选择。您要找的词是“多态性”,这是指方法重写,而不是方法重载。我认为这样更有效:您不会在运行时浪费时间寻找适当的重载。“JVM不知道对象的实际类型”这不是真的。您认为返回什么?这是在运行时,而不是在编译时。编译时间是决定要执行的函数的时间。我不知道这和我引用的句子有什么关系。