2010-02-27 64 views
5

我在做這些網上的Java測試之一,有人問我這樣一個問題:java.lang.Object o = 1; //爲什麼編譯?

問:請說明正確的分配:

Long l = 1; 
Double d = 1; 
Integer i = 1; 
String s = 1; 
Object o = "1"; 
System.out.println(o); 
o = 1; 
System.out.println(o); 

請自己嘗試一下,你再往前走了。

那麼我可以告訴你,我聽錯了,我調查了一下,發現:

//Long l = 1; //cannot widen and then box 
Long ll = 1L;//no need to widen, just box 
//Double d = 1;//cannot widen and then box 
Double dd = 1d;//no need to widen, just box 
Integer i = 1;//no need to widen, just box 
//String s = 1;//cannot do implicit casting here 

Object o = "1";//this compiles and is just plain weird 
System.out.println(o);//output is 1 
o = 1;//this also compiles and is also weird 
System.out.println(o);//output is 1 

誰能告訴我爲什麼:

Object o = 1;Object o = "1";

編譯和輸出1在兩種情況下,這讓我感到困惑。

非常感謝

回答

9

"1"是String類的一個實例和String是Object類的Java中的子類(如任何其他類)。 1被裝箱成Integer,它也是從Object派生的。

+0

哇,謝謝你的回答,但我必須告訴你,我現在覺得這麼愚蠢,我應該知道這一點。 – Ramo 2010-02-27 08:11:05

+0

@Ramo:不要問你不知道的東西會很愚蠢:-) – Grundlefleck 2010-02-27 14:24:24

1

那麼,第一個情況「1」是一個String文字,所以對象的一個​​子類,因此可以賦值給它。作爲一個字符串,它的輸出1相對簡單。

在第二種情況下,正在進行自動裝箱。 Integer是對象的一個​​子類,因此可以賦值給它。同樣,1的輸出也是非常有意義的。

1

這是因爲o的類型是Object。 java中的每個對象都可以擴展類Object。所以......當你說Object o = 1時,它將1從int轉換爲Integer,這是一個Object。同樣,「1」是String,它是Object。在這兩種情況下,在Object上調用System.out.println調用ObjecttoString方法。在這兩種情況下,它都會打印1.

1

您可以放Object o = anything;其中anything是任何對象,因爲所有類都從Object類派生。由於Java 1.5中的自動裝箱功能,它可以與基元一起工作。

3

由於"1"String的一個實例,並且由於1.5 1是自動boxable到Integer;這兩種類型都是Object的亞型。在自動裝箱之前,Object o = 1;不會編譯。

要充分利用此學習體驗,您應該瞭解ObjectgetClass()方法。通過添加System.out.println(o.getClass().getName()),您還可以打印o所指的對象所屬的類的名稱。在你的情況下,他們是java.lang.String(對於(Object) "1")和java.lang.Integer(對於(Object) 1)。

只是爲了完成,我應該提到你現在也可以做Object o = false;