2012-10-12 33 views
0

超載作爲返回類型並不能起到函數重載任何作用,而編譯器只檢查只是這是在調用時使用這些代碼部分的獨特的存在..歧義功能的Java

那麼,爲什麼不這樣代碼包含錯誤

class Temp{ 
    Temp(){ 
    System.out.println("Default Constructor"); 
    } 
    void Temp(){ 
    S.o.p("HEll"); 
    } 
    public static void main(String a[]){ 
    new Temp(); 
    } 
} 

輸出=默認構造函數... // 我感到震驚,沒有編譯錯誤作爲copiler只檢查只是這是在調用時使用的代碼的一部分,意味着編譯器需要檢查只有Temp()的唯一存在並且沒有Temp()的唯一存在。

請闡述

+4

這裏沒有超載。一個是構造函數,另一個是方法。 –

回答

2

因爲void Temp()是一個方法,你應該調用它的實例。允許使用類的名稱聲明方法,但調用是不同的。您只能用new運算符調用構造函數。

可以在JLS#8.8. Constructor Declarations

構造瞭解更多關於構造函數永遠不會被方法調用表達式(§15.12)調用。這裏

主要區別,你應該注意的是構造函數沒有返回類型和超載的定義包括返回類型。

1

Constructors不需要返回類型,void Temp()將被視爲方法而不是構造函數。

當您調用void Temp();時,將調用不帶參數的構造函數。

1

一個是構造函數,另一個不是。

1

編譯器使用關鍵字new區分方法和構造函數調用。只有構造函數可以在new之後關鍵字。

+0

但是編譯器會去檢查Temp()是否存在,如果我們不添加Temp()編譯器會做同樣的事情,而且如果談論方法重載的概念,仍然會去尋找Temp()的獨特存在......我知道這個事實,即編譯器區分方法和構造函數。我懷疑它是如何在構造函數和方法重載條件下完成的。 – Arun

0

類,方法和字段駐留在不同的名稱空間中。編譯器始終可以確定使用哪種構造,並且可以輕鬆區分new Temp()(類)與o.Temp()(方法)和o.Temp(字段)。

+0

是的,我們可能會寫出如Type Type = new Type(); – Aubin

0

使用Eclipse,你可能會避免這種用法:

See the line above "Apply" button 見上面的線「應用」按鈕