2015-04-30 43 views
2

請參見下面的代碼 -數組是否真的是對象?

class test { 
    public static void main(String args[]){ 
     int[] somearray = {1, 2}; 
     printarray(somearray); 
    } 

    static void printarray(Object[] array){ 
     System.out.println(array[0]); 
    } 
} 

上面的代碼不會編譯由於printarray方法不能接受原始陣列。 或者這是一個自動裝箱的限制?如果是這樣,那麼我認爲這是一個很大的限制。

+0

數組* *是一個對象,但是一個基元數組與對象數組不兼容,因爲基元不是對象,並且自動裝箱無法處理該轉換。 – JonK

+4

「由於printarray方法不能接受原始數組,因此上面的代碼將無法編譯。」 - 不,代碼不會編譯,因爲您沒有爲'args'指定類型。將其更改爲'String [] args'並且編譯好。請將其編輯爲您希望我們考慮的* actual *代碼,這會產生您感興趣的錯誤消息。 –

+0

@JonSkeet即使修改了主方法簽名,它也沒有在1.6.0_45上爲我編譯,是這東西現在在1.7/1.8? – JonK

回答

0

數組是否真的是對象?

數組是動態創建對象,並且它們作爲持有相同類型的對象的(常數)數目的容器。它看起來像數組不像任何其他對象,這就是爲什麼他們被區別對待。

您的代碼編譯如果您修復main簽名:

public static void main(String args[]) 

如果添加printarray(somearray)這將不能編譯,因爲somearray是包含int,其中printarray(應被命名的數組printArray)是接受Object數組的方法。

針對您的問題有很多解決方案,其中一個將someArray更改爲Integer[]類型。

+0

'Above由於printarray方法不能接受原始數組,因此代碼將不能編譯。我不相信你已經回答了這個問題。 – CKing

+0

@ChetanKinger我回答了標題。將編輯我的答案。 – Maroun

0

陣列是Object。其實在Java世界中,每一個非基元類型都是Object.因爲你創建的每個類都是直接或間接的Object (java.lang.Object)的子類。

請看下面的代碼片段 -

int[] intArray = new int[10]; 
Object anObject = intArray; //valid assignment 
Object[] objArray = intArray; //invalid assignment. 

這裏intArray本身就是一個Object。所以它可以分配一個Object。但intArray不是Object的數組即Object[]。 因此,我們不能將intArray指定爲Object[]

0

想到的是這樣的:

int是不是Object,其primitive data type

因此int[]是不一樣的Object[]

如果你想保持你printarray方法相同,則 你應將您的somearray更改爲Integer(表示整數的對象)

例如

Integer[] somearray = {1, 2}; 
printarray(somearray); 
4

數組是對象,但是基本類型的陣列不被視爲對象的數組(作爲int不是java.lang.Object)。

爲了使您的代碼的工作,你可以宣佈你的陣列是這樣的:

Integer[] somearray = {1, 2}; 

而不是使用基本類型int的。

請注意,有些拳擊在這裏生效。

+0

這完全沒有回答這個問題。 「陣列真的是物體嗎?」 – CKing

+0

你說得對@ChetanKinger,但也許這不是問題的關鍵。無論如何,它就是這樣。 –

+1

雖然它仍然是一個整型數組而不是對象數組,但這有點危險。試圖將除Integer以外的任何內容放入數組中將拋出ArrayStoreException。 – Raniz

相關問題