2012-07-14 106 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 對象。