3

我注意到,如果我有两个同名的方法,当我用 调用方法时,第一个接受SomeObject,第二个接受扩展的对象,它会自动使用只接受的对象。如果我转换为,则使用接受的方法,即使对象是 instanceof 。这意味着编译时选择了该方法。为什么?SomeObjectSomeOtherObjectSomeObjectSomeOtherObjectSomeObjectSomeObjectSomeOtherObject

4

3 回答 3

6

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

有关所有丑陋的细节,请参阅Java 语言规范 §15.12。

于 2013-08-16T04:09:04.930 回答
1

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

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

为什么?

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

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

  • 它是有效的。在运行时解决方法重载(基于实际参数类型)会使重载的方法调用代价高昂。

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

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

参考:

于 2013-08-16T04:50:15.083 回答
0

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

有关更多详细信息,您可以查看在 Java 规范中选择最具体的方法。

于 2013-08-16T04:52:58.237 回答