2012-05-08 13 views
35

私はJFrameを拡張するクラスを扱っています。コンストラクタでsuper()を呼び出す理由

これは私のコードではなく、GUIの構築を開始する前にsuperを呼び出します。私はいつも呼び出すことなくスーパークラスのメソッドにアクセスして以来、これがなぜ行われているのだろうかと思っています​​

+0

サイドノート:「JFrame」の拡張はおそらく意図したものではありません。拡張とは、is-a関係を意味します。新しいウィンドウコンポーネントを作成しているのでなければ、おそらく 'JComponent'を拡張しているはずです。 – Jeffrey

答えて

64

super()に暗黙の呼び出しがあります。これは、親を持つすべてのクラス(Javaではすべてのユーザー定義クラス)に対して暗黙的に呼び出されるため、通常は明示的に呼び出す必要はありません。しかし、super()の呼び出しは、親のコンストラクタがパラメータをとり、それらを指定したい場合に引数を使用します。さらに、親のコンストラクタがパラメータをとり、デフォルトのパラメータレスコンストラクタがない場合は、super()を引数としてにはが必要です。

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

私たちは、あなたの方法ならば、スーパー()

を使用してスーパークラスのメンバーにアクセスすることができますがスーパークラスのメソッドの1つをオーバーライドする場合は、キーワード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()はサブクラスで宣言1を参照しますスーパークラスのものをオーバーライドします。したがって、Superclassから継承された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(); 
     } 
    } 
関連する問題