2012-07-13 70 views
4

當我發現其中一個構造函數具有「String」對象作爲參數時,我正在查看String.java源代碼。這看起來很簡單,但我無法消化它。 例如:一個類的構造函數如何具有相同類的參數?

public class Example { 

    private String value; 

    public Example() { 
     // TODO Auto-generated constructor stub 
    } 

    public Example(Example e){ 
     value = e.getValue(); 
    } 

    String getValue() { 
     return value; 
    } 
} 

雖然編譯類實施例,第一次,編譯器會遇到「實施例」類對象作爲參數的第二構造函數。在這一點上,它將如何找到它,因爲它仍在編譯這個類?

+0

與Class1引用Class2相同,Class2引用Class1。 – 2012-07-13 07:29:08

+0

@MichaelLaffargue是的,我也擔心這種情況。比如,String類使用java.util.Arrays和Arrays使用String類。但是通過aiobe的回答解決了這個難題。 – param 2012-07-13 08:23:18

回答

12

當編譯該類時,它需要訪問的全部內容是該類的declaration,而不是完整的實現。


換句話說,編譯構造函數時

public Example(Example e) { 
    value = e.getValue(); 
} 

它需要知道的一切是存在命名爲Example和一類,它有一個方法getValue。在實際嘗試編譯代碼之前,可以在源文件中單獨傳遞這些信息。乍一看,它可能看起來像一個構造函數需要在編譯任何方法之前進行編譯,但是這種推理將編譯時問題與運行時混合在一起,時間問題。)

+0

你能更詳細一點嗎? – 2012-07-13 07:29:29

+0

當編譯一個類時,它需要知道的只是該類的名稱 - 而不是它的編譯版本。 – Brad 2012-07-13 07:30:00

-1

每當類中有任何Copy構造函數時,總會有一個構造函數。沒有它不會給出任何錯誤,但在運行時它不會工作。由於首先需要使用非複製構造函數構造對象,然後將其引用傳遞給某個其他構造函數的構造函數。

這就像告訴另一個對象'嘿人,我已經有一些屬性工作正常,你也可以使用相同的屬性。'

請記住,總是有一個非複製構造對象,以便其他對象可以複製它的屬性。

+0

另一個例子可能是必須有人先在課堂上完成作業,以便課堂上的其他學生可以複製它。 – noob 2012-07-13 07:45:00

+0

-1。這個答案顯然是錯誤的。我很容易想象有一個'MyLinkedList(MyLinkedList tail)'構造函數接受'null'作爲參數(或傳遞'MyLinkedList'的子類的對象)。即使這是不允許的,也沒有什麼能阻止你編譯一個只有一個拷貝構造函數的類。此外,這與此處提出的問題相去甚遠。 – aioobe 2012-07-13 09:22:50

+0

@aioobe檢查我的答案,我寫道,沒有非複製構造函數不會在編譯時給你任何錯誤。在構造函數中爲null提供一個條件將使構造函數成爲非複製的構造函數,我們不復制屬性。此外,我只是在解釋提問者如何以外行的方式工作。 – noob 2012-07-13 10:08:12

相關問題