2013-04-24 98 views
-2

這樣的:在java中super和super()有什麼不同?

public class class1 { 
    public void xxx(){ 

     super.getXXX(); 

     super().getXXX(); 

    } 
} 
+4

一個是超,另一種是超級騙子。認真但是,這是編譯?爲什麼不在你的問題中發佈* real *代碼?代碼很簡單,但實際上編譯和演示你問的是什麼? – 2013-04-24 02:20:34

+2

@HovercraftFullOfEels在這種情況下,你可能會成爲這個騙子......? http://en.wiktionary.org/wiki/duper「一個欺騙另一個人的人」 – gutch 2013-04-24 02:21:56

+1

@gutch:你可能是對的。 – 2013-04-24 02:23:28

回答

4

兩個在子類中被用作的方式來調用或引用其超類。

super()是您在構造函數內部或在重寫的方法內部調用超類的構造函數或超類的重寫方法所調用的方法。 super()調用也可以在這些情況下使用參數。

注意,因爲所有的類都默認至少從Object繼承,你可以隨時調用super()構造函數中(必須是在構造函數中的第一條語句雖然)。這個super()調用事實上通常由編譯器默認插入到你的無參數構造函數中。

這可能很麻煩但如果超類沒有無參數的構造函數,雖然,在這種情況下,你的超()調用沒有相應的ARGS將失敗。無參數構造函數通常是默認生成的,所以您不必擔心它,但是如果您已經使用參數明確定義了另一個構造函數,它將不會自動生成,因此您可能需要顯式定義一個你自己。

super而不在另一方面括號是簡單地超類本身的引用,像任何其他變量。它可以用來調用該類中的任何可訪問的方法,或引用該類的任何可訪問字段,就像您使用其他任何引用一樣。例如:super.doSomething()super.x

5

每個類都在java中有一個超類。當您使用super關鍵字時,您指的是超類,並且super上的點運算符將允許您訪問超類的屬性和方法。

super()是超類的構造函數。當您在子類中重寫構造函數時,必須先調用super(),然後才能執行自己的邏輯,如果不這樣做,編譯器將代表您將向無參數構造函數插入一個調用。 (有時候,沒有一個,代碼編譯失敗)

在Java中,調用構造函數爲您提供了一個類的實例,當您執行super()時,它不是同一件事,因爲在那裏並不是在您執行super()時創建的超類的單獨實例。因此,雖然MyClass().doSomething()是完全有效的呼叫,但super().doSomethingElse()不是。

+0

我已經投票贊成這是一個正確的答案。我不確定是誰或者爲什麼有人投了票。 – 2013-04-24 02:27:54

+0

*「...你必須打電話給super()...」 - - 是和不是。必須調用超類的構造函數,但如果超類中有明確或隱式的無參數構造函數,它*可能是隱式的。 – 2013-04-24 02:59:40

+0

@StephenC照顧。感謝您指出。 – 2013-04-24 03:05:17

相關問題