我注意到如果我有两个同名的方法,第一个接受SomeObject
,第二个接受SomeObject
的对象,当我用SomeOtherObject
调用方法时,它会自动使用只接受SomeObject
的那个。如果我将SomeOtherObject
转换为SomeObject
,则会使用接受SomeObject
的方法,即使该对象是SomeOtherObject
的实例也是如此。这意味着在编译时选择该方法。为什么呢?
答案 0 :(得分:7)
这就是Java中方法重载解析的工作原理:在编译时选择该方法。
对于所有丑陋的细节,请参阅the Java Language Specification §15.12.
答案 1 :(得分:2)
这意味着在编译时选择了该方法。
是的,你是对的。这就是它的意思。
为什么?
我可以想到他们以这种方式设计Java的四个原因:
这与支持重载工作的其他静态类型OO语言的方式一致。这是来自C ++世界的人们所期望的。 (这在Java的早期尤为重要......虽然现在不是很多。)。值得注意的是,C#以相同的方式处理重载。
效率很高。在运行时解析方法重载(基于实际的参数类型)会使重载的方法调用变得昂贵。
它提供了更可预测(因此更容易理解)的行为。
它避免了脆弱的基类问题,在基类中添加新的重载方法会导致现有派生类出现意外问题。
参考文献:
答案 2 :(得分:0)
是的,要执行的功能是在编译时决定的!因此JVM在编译时不知道Object的实际类型。它只知道指向作为函数参数给出的对象的引用类型。
有关更多详细信息,请参阅选择Java规范中的Most Specific Method。