web-dev-qa-db-ja.com

コンストラクターでsuper()を呼び出す理由

JFrameを拡張するクラスを扱っています。

これは私のコードではなく、GUIの構築を開始する前にsuperを呼び出します。私は常にsuper();を呼び出さずにスーパークラスのメソッドにアクセスしただけなので、なぜこれが行われるのか疑問に思っています。

51
mark

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

super()を明示的に呼び出すことで、フレームのタイトルをさらに制御できる例:

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

親クラスの空のコンストラクタsuper()への呼び出しは、自分で実行しない場合に自動的に実行されます。これが、コードでこれを行う必要がなかった理由です。それはあなたのために行われました。

スーパークラスに引数なしのコンストラクタがない場合、コンパイラは適切な引数を使用してsuperを呼び出す必要があります。コンパイラは、クラスを正しくインスタンス化することを確認します。したがって、これはあまり心配する必要はありません。

コンストラクタでsuper()を呼び出すかどうかにかかわらず、親クラスのメソッドを呼び出す機能には影響しません。

補足として、明確にするために、一般的にその呼び出しを手動で行うことが最善であると言う人もいます。

19
Tim Pote

スーパーメソッドを使用してスーパークラス要素にアクセスできます

メソッドfooの異なる実装を持つ2つのクラス、ParentクラスとChildクラスがあるとします。子クラスでは、親クラスのメソッド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();
        }
    }
2
Javapocalypse

スーパークラスのデフォルトコンストラクターを呼び出すだけです。

super()を使用してSuperClassメンバーにアクセスできます

メソッドがスーパークラスのメソッドの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()はサブクラスで宣言されたものを指し、スーパークラスの名前をオーバーライドします。したがって、スーパークラスから継承されたprintMethod()を参照するには、サブクラスは、示されているようにsuperを使用して、修飾名を使用する必要があります。サブクラスをコンパイルして実行すると、次が出力されます。

_Printed in Superclass.
Printed in Subclass
_
0
Mdhar9e