【问题标题】:Two methods with the same name in javajava中两个同名方法
【发布时间】:2013-08-16 04:07:51
【问题描述】:

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

【问题讨论】:

    标签: java methods extends


    【解决方案1】:

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

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

    【讨论】:

    • @tbodt 您要查找的词是“多态”,这是用于方法覆盖,而不是方法重载。
    • 我认为这样更有效:您不会浪费时间在运行时寻找合适的重载。
    【解决方案2】:

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

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

    为什么?

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

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

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

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

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

    参考资料:

    【讨论】:

      【解决方案3】:

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

      有关更多详细信息,您可以查看在 Java 规范中选择 Most Specific Method

      【讨论】:

      • “JVM 不知道对象的实际类型” 是不正确的。你认为Object#getClass() 会带来什么回报?
      • 那是在运行时而不是在编译时。编译时间是决定要执行的函数的时间。
      • 我看不出这与我引用的句子有什么关系。
      猜你喜欢
      • 1970-01-01
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 2012-05-21
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多