Java中合法调用和重载函数的确定

Java中合法调用和重载函数的确定,java,object,Java,Object,这个夏天我在做一些自我学习,我遇到了这个我不确定的问题,我想知道是否有人能帮我。我不确定最后一个数字,但如果有人愿意检查的话,我也包括了我以前的答案。这不是任何一门课的家庭作业,我只是想确保在我前进之前我明白我在做什么 我正在考虑以下定义: 1. void m (Object o, long x, long y) 2. void m (String s, int x, long y) 3. void m (Object o, int x, long y) 4. void m (String s,

这个夏天我在做一些自我学习,我遇到了这个我不确定的问题,我想知道是否有人能帮我。我不确定最后一个数字,但如果有人愿意检查的话,我也包括了我以前的答案。这不是任何一门课的家庭作业,我只是想确保在我前进之前我明白我在做什么

我正在考虑以下定义:

1. void m (Object o, long x, long y)
2. void m (String s, int x, long y)
3. void m (Object o, int x, long y)
4. void m (String s, long x, int y)
这些声明:

Object o;
String v;
int a;
long b;
我正在检查这些电话:

m(v,a,b); Calls 2, because it is the most specific.
m(v,a,a); Not legal, because 2 and 4 could both be called (not specific enough).
m(v,b,a); Calls 4, because it is the most specific. 
m(v,b,b); Calls 1, because it is the only one that will fit (long cannot shorten to int).
m(o,b,b); Calls 1, similar reasoning as above answer.
m(o,a,a); Unsure.  I'm not sure of the precedence.

提前谢谢

最后一个将调用3。由于第一个参数是Object,它只能选择其中一个方法,并将Object作为第一个参数——因此剩下1或3作为选项。第三个参数
int
适合
long
,因此在这两种情况下都是合法的。第二个参数可以精确地拟合为3,而它必须加宽才能拟合为1。编译器优先考虑精确匹配而不是加宽

你以前的答案也是正确的

这又是一个“最具体”的简单例子。选择选项3的原因与您的第二次通话是非法的相同
m(v,a,a)
无法在
m(String,long,int)
m(String,int,long)
之间进行选择,因为它们同样特定。每个参数都需要一个参数的单个加宽转换<另一方面,code>m(o,a,a)可以在
m(Object,long,long)
m(Object,int,long)
之间进行选择。其中之一需要两次加宽转换。另一个只需要一个,使其最具体。

m(v,b,b);调用1,因为它是唯一适合的(long不能缩短为int)


调用1的另一个原因是Java的多态性和单根层次结构。字符串(或任何对象)是对象类的后代。任何将Object作为参数的方法都可以使用字符串,这是多态性的本质。

您自己尝试过吗?如果问题是为什么选择重载,那是一回事;但如果问题是选哪一个,这很容易测试。两者都有点关系,但你是对的,我甚至没有想过测试它。这真的很容易弄明白。谢谢谢谢!我早该意识到那个东西放不下绳子。如果我意识到这一点,我会立刻被带到3号。非常感谢!我没有意识到对象只能适合对象,但字符串可以适合对象/字符串。一旦你指出了这一点,我马上明白为什么是3。