java中有两个同名的方法

时间:2013-08-16 04:07:51

标签: java methods extends

我注意到如果我有两个同名的方法,第一个接受SomeObject,第二个接受SomeObject的对象,当我用SomeOtherObject调用方法时,它会自动使用只接受SomeObject的那个。如果我将SomeOtherObject转换为SomeObject,则会使用接受SomeObject的方法,即使该对象是SomeOtherObject的实例也是如此。这意味着在编译时选择该方法。为什么呢?

3 个答案:

答案 0 :(得分:7)

这就是Java中方法重载解析的工作原理:在编译时选择该方法。

对于所有丑陋的细节,请参阅the Java Language Specification §15.12.

答案 1 :(得分:2)

  

这意味着在编译时选择了该方法。

是的,你是对的。这就是它的意思。

  

为什么?

我可以想到他们以这种方式设计Java的四个原因:

  • 这与支持重载工作的其他静态类型OO语言的方式一致。这是来自C ++世界的人们所期望的。 (这在Java的早期尤为重要......虽然现在不是很多。)。值得注意的是,C#以相同的方式处理重载。

  • 效率很高。在运行时解析方法重载(基于实际的参数类型)会使重载的方法调用变得昂贵。

  • 它提供了更可预测(因此更容易理解)的行为。

  • 它避免了脆弱的基类问题,在基类中添加新的重载方法会导致现有派生类出现意外问题。

参考文献:

答案 2 :(得分:0)

是的,要执行的功能是在编译时决定的!因此JVM在编译时不知道Object的实际类型。它只知道指向作为函数参数给出的对象的引用类型。

有关更多详细信息,请参阅选择Java规范中的Most Specific Method

相关问题