我不明白在下面的例子中,int7是如何被认为是对象的。
sifer(7)被认为是方法sifer(对象o)。我不能理解这是怎么发生的。在我的一本java参考书中,它说Int可以被装箱到一个Integer,然后“加宽”到一个object。我不确定这是什么意思。
>> Class A
class A { }
>> Class B
class B extends A { }
>> Class ComingThru
public class ComingThru {
static String s ="-";
static void sifer(A[] ...a2)
{
s = s + "1";
}
static void sifer(B[] b1)
{
s += "3";
}
static void sifer(Object o)
{
s += "4";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
A[] aa= new A[2];
B[] ba = new B[2];
//sifer(aa);
//sifer(ba);
sifer(7);
System.out.println(s);
} }
发布于 2012-07-14 14:54:04
由于没有sifer(int)方法,编译器将尝试查找“最接近的匹配”。在本例中,其他两个sifer方法将数组作为参数,而int显然不是。
最后一种方法,sifer(Object)可以应用于任何对象,包括Integer,因此这就是用于sifer(7)的方法。
reality is a little more complex和JVM将按以下顺序查找匹配方法:
sifer(int),但没有这样的method
例如,
sifer(long),但没有这样的method
不适用,object不是
整数是装箱转换(可选),后面是扩大引用转换,在您的情况下,这就是发生的事情:被装箱为
在您的例子中,
发布于 2012-07-14 15:10:14
1.上面的代码提供了一个经典的方法重载的例子,以及AutoBoxing和Java1.5带来的自动拆箱,导致手动装箱和拆箱是一件痛苦的事情。
2. The sifer(A[]... a2)和sifer(B[] b1)都在其参数中接受数组类型的实参,该实参不可能与匹配。所以现在我们只剩下sifer(Object o)了。
3.现在int将自动转换为Wrapper Object Integer。
你可以通过snifer(Object o)方法来验证它。
o.getClass().getName();有关详细信息,请参阅此链接:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html
发布于 2012-07-14 14:50:50
https://stackoverflow.com/questions/11481689
复制相似问题