77

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

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

4

7 に答える 7

130

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

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

class MyFrame extends JFrame
{
    public MyFrame() {
        super("My Window Title");
        ...
    }
}
于 2012-05-09T00:05:58.437 に答える
34

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

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

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

補足として、わかりやすくするために手動で呼び出すのが一般的には最善であると言う人もいます。

于 2012-05-08T23:53:45.150 に答える
1

super キーワードを使用して、スーパークラスのメンバーを呼び出します。

サブクラスは親からすべてのメンバー (フィールド、メソッド、ネストされたクラス) を継承し、コンストラクターはメンバーではないため (オブジェクトに属していません。オブジェクトの作成を担当します)、サブクラスによって継承されません。

したがって、スーパークラスのオブジェクトを作成する必要がある場合にコンストラクターのチェーンが接続されたままになるように、親コンストラクターの呼び出しを明示的に行う必要があります。オブジェクトの作成時には、コンストラクターを 1 つだけ呼び出すことができます。super を介して、必要に応じて現在のコンストラクター内から他のコンストラクターを呼び出すことができます。

他のクラスを拡張していないクラスのためになぜそこにあるのかを考えている場合は、すべてのクラスがデフォルトでオブジェクト クラスに従うことを覚えておいてください。そのため、コンストラクターで super を保持することをお勧めします。

注: 最初のステートメントに super() がない場合でも、コンパイラが追加します!

于 2021-06-10T18:24:26.500 に答える
1

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

于 2012-05-08T23:55:59.230 に答える
1

上記の答えはどれも「理由」に答えていません。

ここで良い説明を見つけました:

サブクラスは独自のプライベート データ メンバーを持つことができるため、サブクラスも独自のコンストラクタを持つことができます。

サブクラスのコンストラクターは、サブクラスのインスタンス変数のみを初期化できます。したがって、サブクラス オブジェクトがインスタンス化されると、サブクラス オブジェクトはスーパークラスのコンストラクタの 1 つも自動的に実行する必要があります。

また、スーパーキーワードに関するすべてをここで読むこともできます。

于 2021-04-03T14:28:51.217 に答える
0

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

メソッドがそのスーパークラスのメソッドの 1 つをオーバーライドする場合、キーワード を使用してオーバーライドされたメソッドを呼び出すことができますsuper。super を使用して隠しフィールドを参照することもできます (ただし、フィールドを隠すことは推奨されません)。このクラス、スーパークラスを考えてみましょう:

public class Superclass {

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

// これは Subclass と呼ばれる、オーバーライドするサブクラスです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
于 2015-08-11T12:09:15.543 に答える