2013-10-15 40 views
2

爲什麼可以將一個原語傳遞給一個接受對象的方法?基元變成了一個物體嗎?像int = Integer和boolean = Boolean?爲什麼我可以將一個原語傳遞給一個需要一個對象的方法?

我可以調用下面的函數:

hash(41, 0); 

    public static int hash(int seed, Object object) 
    { 
     int result = seed; 
     if(object == null) 
     { 
      return hash(result, 0); 
     } 
     else if(!isArray(object)) 
     { 
      result = hash(result, object.hashCode()); 
     } 
     else 
     { 
      int length = Array.getLength(object); 
      for(int index = 0; index < length; ++index) 
      { 
       Object item = Array.get(object, index); 
       // prevent looping if item in array references the array itself 
       if(!(item == object)) 
       { 
        result = hash(result, item); 
       } 
      } 
     } 
     return result; 
    } 
+0

你是否使用散列(41,0)調用散列(int seed,Object object)? – UDPLover

回答

4

是的,這就是所謂的裝箱轉換int值是「裝箱」成Integer,這是一個Object。從1.5開始,它已經可以在Java中使用。

JLS, Section 5.1.7列出可用的裝箱轉換:

拳擊轉換是轉換原始類型的表達式來引用類型的 相應表達式。具體來說, 以下九個轉換被稱爲裝箱轉換:

  • 從布爾型輸入布爾

  • 從類型字節輸入字節

  • 從類型短類型的短

  • 從字符型到字符型字符

  • 從int類型Integer類型

  • 從long類型爲long類型

  • 從float類型爲float類型

  • 從型雙輸入雙

  • 從null類型空類型

此外,在方法調用轉換期間允許裝箱轉換,這真是這裏發生的事情。該值正在轉換爲另一種類型,因爲int0正在傳遞給期望Object的方法。的JLS, Section 5.3,列表裝箱轉換爲方法調用轉換的一個方法:

方法調用上下文允許使用以下中的一種:

  • 的標識轉換(§5.1.1)

  • 加寬原語轉換(§5.1.2)

  • 加寬引用轉換(§5.1.5)

  • 裝箱轉換(§5.1.7)任選地隨後通過加寬參考 轉換

  • 取消裝箱轉換(§5.1.8)任選地隨後進行加寬 原始轉換。

1

當然可以。所謂的autoboxing/unboxing是由編譯器自動完成的。以下是文檔摘錄。

自動裝箱是自動轉換,Java編譯器使得原始類型及其相應的對象包裝 類之間 。例如,將int轉換爲整數,雙精度轉換爲雙精度,等等。如果轉換以其他方式進行,則這是 稱爲取消裝箱。

int i = 1; 
Integer boxI = i; // Autoboxing is performed automatically by the compiler 

Integer ii = 1; 
int i = ii; // Auto(un)boxing is performed automatically by the compiler 
0

是,原始轉化爲對象,反之亦然,並且該概念被稱爲裝箱和拆箱。在較新版本的java中,這是自動完成的,因此稱爲自動裝箱和自動拆箱。

Oracle doc for Boxing and UnBoxing

每個基元具有對應包裝類。

  • INT - >整數
  • 布爾 - >布爾
  • 炭 - >字符

等。

相關問題