繁体   English   中英

java中有两个同名的方法

[英]Two methods with the same name in java

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

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

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

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

是的,你是对的。 这就是它的含义。

为什么?

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

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

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

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

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

参考文献:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM