2012-11-26 112 views
3

當構造函數調用'super()'而沒有任何超類以外的對象時會發生什麼(如果有的話)?像這樣:調用超級()沒有超類?

public class foo implements Serializable, Comparable { 

    int[] startPoint; 

    public foo() { 

    super(); 

    startPoint = {5,9}; 
    } 
} 

編輯:所以如果這什麼都不做,爲什麼會有人明確寫在代碼中?如果我只是刪除該行,它會有什麼區別嗎?

+2

閱讀關於它的所有信息:http://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html –

回答

7

它始終是確定以刪除任何構造線​​,並沒有什麼講究的類,擴展Object構造函數。無限的超類構造函數的調用總是隱含的,所以不管你是否寫下來,你總是得到完全相同的語義。

請注意,這意味着如果您省略對超類構造函數的調用,例如啓動數據庫連接或整個GUI,那麼無論您是否實際編寫​​,都會發生這種情況。

+0

當然,但爲什麼有人會寫它?爲什麼它甚至作爲關鍵字存在? –

+0

@fakefake ..如果你想調用超類的參數化構造函數,你需要編寫它。編譯器默認只添加一個對'0-arg構造函數'的調用。 –

+0

@fakefake沒有特別的理由,除了「清晰」。 Java有很多功能,甚至是針對絕對初學者的「最佳實踐」。當我在我編輯的任何代碼中看到該行時,我立即將其刪除。但是,如果您質疑超類構造函數調用的概念的存在,那是完全不同的事情。當然,這些呼叫是非常需要的(如上面由Rohit所解釋的)。 –

6

總有一種叫Object超類,所以它會調用的Object

1

構造如你所說,有一個超類(對象)。

默認的對象構造函數將被調用。

2

這只是調用Object()構造函數,就好像您有任何其他具有不帶參數的構造函數的超類。

8

super()是構造函數中的第一個調用,無論是顯式還是隱式完成。 (當然,你可能需要更改參數以匹配父類的構造。)

您的代碼:

public foo() 
{ 
    startPoint = {5,9}; 
} 

從上面的代碼中看到什麼編譯:

public foo() 
{ 
    super(); 
    startPoint = {5,9}; 
} 

所以super()調用無論你是否明確地將它放在你的代碼中。 因爲所有的類都是從Object類派生的,所以您調用Object的構造函數,調用您的super()調用,因爲您的類沒有任何中間父項。

+0

嗯,這個答案真的給初學者提供了一個有價值的信息,但恐怕它不是'目前沒有真正回答這個問題。請更新它。 –

+0

@RohitJain你能解釋一下親愛的羅希特遺失了什麼? – Juvanis

+0

@ivanovic ..實際上,OP詢問,如果沒有超類(顯式)給類,super()調用委託給了哪裏。但我仍然會給你一個+1這個答案。 :) –

1

它調用Object的構造函數,它是空的(什麼都不做)。

1

如果類不從一個類繼承,那麼super()總是調用構造函數給Object類。

類對象是類層次結構的根。每個班級都有Object作爲超級班。所有對象,包括數組,都實現了這個類的方法。

Check this link