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

时间:2013-05-27 18:40:23

标签: 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, 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 个答案:

答案 0 :(得分:2)

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

您以前的答案也是正确的。

答案 1 :(得分:2)

这是一个简单的“最具体”的案例。选择选项3的原因与您的第二次呼叫是非法的相同。 m(v,a,a)无法在m(String,long,int)m(String,int,long)之间进行选择,因为它们具有同等效力。每个都需要对其中一个参数进行单一扩展转换。另一方面,m(o,a,a)可以在m(Object,long,long)m(Object,int,long)之间进行选择。其中之一需要两次扩大转换。另一个只需要一个,使其最具体。

答案 2 :(得分:0)

米(V,B,B);调用1,因为它是唯一适合的(long不能缩短为int)。

这种调用1的另一个原因是由于多态性和单根的Java层次结构。 String(或任何对象)是Object类的后代。任何以Object作为参数的方法都可以采用String - 多态性的本质。