2012-05-08 62 views
35

我正在處理擴展JFrame的類。爲什麼要在構造函數中調用super()?

這不是我的代碼,這讓超級調用它開始修建GUI之前。我想知道爲什麼這樣做,因爲我總是訪問超類的方法,而無需調用​​

+0

備註:擴展'JFrame'可能不是你想要做的。擴展意味着一種關係。除非你正在創建一個新的窗口組件,否則你應該擴展'JComponent'。 – Jeffrey

回答

64

有一個隱含的調用super()沒有參數的所有類有一個父 - 這是每個用戶定義在Java類 - 所以明確調用通常不是必需的。但是,如果父項的構造函數接受參數,並且希望指定它們,則可能會使用帶有參數的super()調用。此外,如果父類的構造需要的參數,它有沒有默認參數的構造函數,你會需要調用super()與參數(S)。

一個例子,在那裏super()顯式調用使您能夠框架的標題一些額外的控制:

class MyFrame extends JFrame 
{ 
    public MyFrame() { 
     super("My Window Title"); 
     ... 
    } 
} 
+0

_也很重要:_superclass_構造函數的調用**必須是_subclass_構造函數中的第一行**。相關信息在這裏:[爲什麼this()和super()必須是構造函數中的第一條語句?](https://stackoverflow.com/questions/1168345/why-do-this-and-super-have-在構造函數中的第一個語句) – informatik01

14

當你不自己做時,調用父類的空構造函數super()會自動完成。這就是你在代碼中從來不需要這樣做的原因。它是爲你完成的。

當你的超沒有一個無參數的構造函數,編譯器將需要向super使用適當的參數。編譯器將確保您正確地實例化類。所以這不是你必須擔心的事。

無論你叫super()在構造函數或沒有,它不會影響你打電話給你的父類的方法能力。

作爲一個側面說明,有人說,這是一般最好手動打這通電話爲了清楚起見。

+0

另外,請注意,當需要傳遞參數給它時,需要顯式調用'super()'。 –

+0

@SamDufel良好的通話,看我的編輯。 –

0

它只是簡單地調用父類的默認構造函數。

+1

不回答這個問題,這是'爲什麼'。不要將代碼格式設置爲不是代碼的文本。 – EJP

0

我們可以使用超()

如果你的方法來訪問父類成員覆蓋其超類方法之一,則可以通過使用關鍵字super來調用重寫的方法。您也可以使用super來引用隱藏字段(儘管不鼓勵隱藏字段)。考慮這個類,超類:

public class Superclass { 

    public void printMethod() { 
     System.out.println("Printed in Superclass."); 
    } 
} 

//這裏是一個子類,稱爲子類,重寫printMethod()

public class Subclass extends Superclass { 

    // overrides printMethod in Superclass 
    public void printMethod() { 
     super.printMethod(); 
     System.out.println("Printed in Subclass"); 
    } 
    public static void main(String[] args) { 
     Subclass s = new Subclass(); 
     s.printMethod();  
    } 
} 

在子類中,簡單名稱printMethod()是指一個子類中,聲明其覆蓋超類中的一個。因此,要引用從超類繼承的printMethod(),Subclass必須使用限定名稱,如圖所示使用super。編譯和執行子類打印以下內容:

Printed in Superclass. 
Printed in Subclass 
+0

第一句話是不正確的,而且這些都不能回答這個問題。 – EJP

2

我們可以通過使用超級方法

考慮,我們有兩個類,父類和子類,與foo方法的不同實現訪問超類的元素。現在在子類中,如果我們想調用父類的方法foo,我們可以通過super.foo()來實現。我們也可以通過super()方法訪問父元素。

class parent { 
    String str="I am parent"; 
    //method of parent Class 
    public void foo() { 
     System.out.println("Hello World " + str); 
    } 
} 

class child extends parent { 
    String str="I am child"; 
    // different foo implementation in child Class 
    public void foo() { 
     System.out.println("Hello World "+str); 
    } 

    // calling the foo method of parent class 
    public void parentClassFoo(){ 
     super.foo(); 
    } 

    // changing the value of str in parent class and calling the foo method of parent class 
    public void parentClassFooStr(){ 
     super.str="parent string changed"; 
     super.foo(); 
    } 
} 


public class Main{ 
     public static void main(String args[]) { 
      child obj = new child(); 
      obj.foo(); 
      obj.parentClassFoo(); 
      obj.parentClassFooStr(); 
     } 
    } 
相關問題