我注意到,如果我有两个同名的方法,当我用 调用方法时,第一个接受SomeObject
,第二个接受扩展的对象,它会自动使用只接受的对象。如果我转换为,则使用接受的方法,即使对象是 instanceof 。这意味着编译时选择了该方法。为什么?SomeObject
SomeOtherObject
SomeObject
SomeOtherObject
SomeObject
SomeObject
SomeOtherObject
user1779715
问问题
445 次
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 回答