Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中同名的两个方法_Java_Methods_Extends - Fatal编程技术网

java中同名的两个方法

java中同名的两个方法,java,methods,extends,Java,Methods,Extends,我注意到,如果我有两个同名的方法,第一个接受SomeObject,第二个接受扩展SomeObject的对象,当我用SomeOtherObject调用该方法时,它会自动使用只接受SomeObject的方法。如果我将SomeOtherObject强制转换为SomeObject,则会使用接受SomeObject的方法,即使该对象是SomeOtherObject的实例。这意味着在编译时选择了该方法。为什么?这就是Java中方法重载解析的工作原理:方法是在编译时选择的 有关所有丑陋的细节,请参见 这意味着

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

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

有关所有丑陋的细节,请参见

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

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

为什么?

我能想到他们这样设计Java的四个原因:

  • 这与其他支持重载的静态类型OO语言的工作方式是一致的。这就是来自C++世界的人们所期待的。(在Java的早期,这一点特别重要……尽管现在不那么重要。)。值得注意的是,C#以同样的方式处理重载

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

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

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

参考资料:


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


有关更多详细信息,您可以在Java规范中选择。您要找的词是“多态性”,这是指方法重写,而不是方法重载。我认为这样更有效:您不会在运行时浪费时间寻找适当的重载。“JVM不知道对象的实际类型”这不是真的。您认为返回什么?这是在运行时,而不是在编译时。编译时间是决定要执行的函数的时间。我不知道这和我引用的句子有什么关系。