0

在下面的示例中,我无法弄清楚 int 7 如何被视为对象。

sifer(7) 被认为是方法 sifer(Object o)。我无法理解这是怎么发生的。在我的一本 java 参考书中,它说 Int 可以装箱为 Integer,然后“扩大”为对象。我不确定那是什么意思。

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


}  

}

4

4 回答 4

3

由于没有sifer(int)方法,编译器将尝试找到“最接近的匹配”。在这种情况下,其他两种sifer方法将数组作为参数,而 int 显然不是。

最后一种方法,sifer(Object)可以应用于任何对象,包括一个Integer用于sifer(7).

实际情况稍微复杂一些,JVM 会按以下顺序寻找匹配的方法:

  • 身份转换
    • 在你的情况下:sifer(int)但没有这样的方法
  • 扩大的原始转换
    • 在你的情况下:sifer(long)例如,但没有这样的方法
  • 扩大参考转换
    • 在您的情况下:不适用, int 不是对象
  • 可选的装箱转换,然后是扩大的参考转换
    • 在您的情况下,这就是正在发生的事情: int 被装箱为 Integer 被扩大到 Object
  • 一个拆箱转换(可选地后跟一个扩大的基元转换)
    • 在您的情况下:不适用
于 2012-07-14T06:54:04.367 回答
1

1.上面的代码提供了一个经典的方法重载示例,以及Java 1.5带来的AutoBoxing和Auto-UnBoxing,导致手动装箱和Unboxing很痛苦。

2. The sifer(A[]... a2)并且sifer(B[] b1)两者都在其参数中接受 Array 类型的 Arguments,这与 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

于 2012-07-14T07:10:14.307 回答
0

7将被自动装箱IntegerObject

另见

于 2012-07-14T06:50:49.900 回答
0

步骤如下-

  1. int (7) 被装箱成一个整数。
  2. Integer 引用扩大到 Object(因为 Integer 扩展了 Object)。
  3. sifer() 方法获得了一个实际上指向 Integer 对象的 Object 引用。
于 2012-07-14T07:30:55.527 回答