2013-07-29 305 views
0

我知道在基本數據類型的情況下的自動類型提升概念。但是在引用數據類型的情況下,我有下面的代碼,它完美地工作。爲什麼對象類不是空值

public class Test4 { 

void set(Object o) { 
    System.out.println("Inside Object"); 
} 

void set(double[] a) { 
    System.out.println("Array"); 
} 
public static void main(String[] args) { 
    new Test4().set(null); 

} 
} 

它給出輸出數組。

但是,如果在地方對象O的,如果我們有任何其他的類,那麼這將顯示編譯時錯誤的方法是不明確的類型TEST4

下面的代碼提供編譯時錯誤

public class Test4 { 

/*void set(Object o) { 
    System.out.println("Inside Object"); 
}*/ 

void set(String s) { 
    System.out.println("String"); 
} 
void set(double[] a) { 
    System.out.println("Array"); 
} 
public static void main(String[] args) { 
    new Test4().set(null); 

} 

} 

據我所知,每個引用數據類型(Class,Interface和Array)的默認值爲null。

那麼爲什麼上面的代碼工作在對象o的情況下。

在此先感謝

回答

7

編譯器總是選擇具有更多特定參數類型的方法,該方法可以匹配傳遞的參數,以防參數可以用於這兩個參數。

因爲,null對於String,Object,double[]有效,所以編譯器必須決定調用哪個方法。

  • Objectdouble[]情況下,由於double[]Object更具體的(陣列只不過是Object)。所以編譯器會在這裏選擇更具體的類型 - double[]
  • Stringdouble[]的情況下,編譯器無法確定哪一個是更具體的類型,因爲數組和字符串類型之間沒有任何關係(它們不屬於同一繼承層次結構)。因此,這種呼籲模糊不清。

你可以通過JLS §15.12.2.5 - Choosing the Most Specific Method

0

因爲double[]更爲具體。

double[]Object。所以當你打電話給set(some-double-array)這個版本。請注意,該null是好的double[]

但在第二種情況下沒有更具體的方法。

-3

因爲,對象不是數據類型,只要用戶輸入一些數據,它決定它的數據類型。例如, Object obj = null; //語法錯誤

Object obj = 4.0; //這裏的obj是雙倍的,因爲傳遞的值是4.0

Object obj =「raj」; //這裏obj是字符串。

對象與javascript中的var相同。

+2

這是完全錯誤的。對象不是*和JavaScript var相同。這是完全合法的:'Object o = new Object();'和Object obj = null;'。它甚至編譯。也許你正在考慮Java以外的語言? –

相關問題