2012-07-14 54 views
0

我无法弄清楚int 7是如何考虑作为对象在下面的例子。需要了解拳击在核心java

sifer(7)被认为是方法sifer(Object o)。我无法知道这是怎么发生的。在我的一本java参考书中,它说INT可以被装箱到一个整数,然后“扩大”到一个对象。我不确定这意味着什么。

>> 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); 


} 

}

回答

3

由于没有sifer(int)方法,因此编译器会尝试查找“最匹配”。在这种情况下,其他2 sifer方法将数组作为参数,而int不是。

最后一种方法sifer(Object)可应用于任何对象,包括Integer,因此这是用于sifer(7)的方法。

reality is a little more complex,和JVM将查找在下列顺序匹配马托:

  • 的标识转换
      你的情况
    • sifer(int)但目前还没有这样的方法
  • 拓宽图元转换
    • 你的情况:sifer(long)例如,但不存在这样的方法
  • 加宽引用转换
      你的情况
    • :不适用,int是不是一个对象
  • 装箱转换可选地接着加宽参考转换
    • 你的情况就是这样发生了什么:int被整形为整形,被扩大到对象
  • 取消装箱转换任选接着进行加宽原语转换
    • 你的情况:不适用
+0

谢谢YOu的答案。 – MKod 2012-07-16 08:13:48

1

1。上面的代码提供了方法重载一个典型的例子,与自动装箱和自动拆箱里面传来在Java 1.5一起,导致手动装箱和拆箱是一种痛苦。

2.The sifer(A[]... a2)sifer(B[] b1)无论在其参数,这是任何方式匹配INT接受阵列类型参数。所以现在我们只剩下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

+0

谢谢你宝贵的回答。赞赏。 – MKod 2012-07-16 08:14:21

+0

Ur欢迎.......... – 2012-07-16 08:56:31

0

步骤如下─

  1. 的int(7)中的盒装到一个整数。
  2. 整数引用被加宽为一个对象(因为整数扩展对象)。
  3. sifer()方法得到了一个对象引用,它实际上引用了一个Integer 对象。