super()はいつ使用しますか?


82

現在、Javaコースでクラスの継承について学習していますが、いつsuper()呼び出しを使用するかわかりませんか?

編集:使用されている
コードのこの例を見つけました:super.variable

class A
{
    int k = 10;
}

class Test extends A
{
    public void m() {
        System.out.println(super.k);
    }
}

したがって、ここでは、を使用してスーパークラスの変数にsuperアクセスする必要があることを理解していますk。しかし、他の場合、何をしsuper();ますか?そのままで?


31
実際、この例でsuperは、を参照する必要はありませんkk直接参照できます。 ()で指定された別のフィールドを宣言した場合にsuperのみ、アクセスA.kする必要があります。kTestTest.k
マークピーターズ

回答:


143

正確に 呼び出すことsuper()常に冗長です。それ以外の場合は暗黙的に実行されることを明示的に実行しています。これは、スーパーコンストラクターの呼び出しを省略した場合でも、引数のないスーパーコンストラクターが自動的に呼び出されるためです。それが悪いスタイルだと言っているのではありません。露骨な表現が好きな人もいます。

ただし、これが役立つのは、スーパーコンストラクターがサブクラスから渡したい引数を受け取る場合です。

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}

2
メソッドが子クラスでオーバーライドされてから、その子クラスで再度オーバーライドされるとします。(マルチレベル継承)祖父母と親のメソッドを同時に孫クラスに呼び出す必要がある場合はどうなりますか。スーパーはどのように使用されますか?
h8pathak 2015

2
@ h8pathak:子クラスがその親の実装をバイパスして祖父母を呼び出す方法を尋ねている場合、それはJavaでは不可能です。
マークピーターズ

44

superconstructormethodsおよびpropertiesの親クラスを呼び出すために使用されます。


23

superサブクラスでメソッドをオーバーライドしたときに親クラスからメソッドを呼び出す場合は、サブクラスでキーワードを使用することもできます。

例:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

ここで、この行super.print()print()スーパークラスのメソッドを呼び出しますCellPhone。出力は次のようになります。

I'm a cellphone
I'm a touch screen cellphone

1
メインメソッド宣言行の(String [] args)でしたか?どうもありがとう!
アパラチア数学

9

スーパークラスコンストラクターを呼び出す場合-その中のフィールドを初期化します。いつ使用するかを理解するには、この記事を参照してください。

http://download.oracle.com/javase/tutorial/java/IandI/super.html


4
リンクに記載されているように、Javaが暗黙的に追加するため、を呼び出す必要はありませんsuper()。ただしsuper(args)、デフォルト以外の親コンストラクターが必要な場合は、呼び出す必要があります。
Michael Brewer-Davis

9

これをサブクラスコンストラクターの最初の行として使用して、その親クラスのコンストラクターを呼び出します。

例えば:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

のインスタンスを作成TheSubすると、eatCake()eatMoreCake()


1

これを使用して、スーパークラスのメソッドを呼び出すことができます(このようなメソッド、super.foo()などをオーバーライドする場合など)。これにより、その機能を維持し、オーバーライドされた他のメソッドを追加することができます。方法。



1

super()スーパークラスのコンストラクターを具体的に実行するために呼び出します。クラスは複数のコンストラクタを持つことができることを考えると、あなたはどちらか特定のコンストラクタを使用して呼び出すことができるsuper()か、super(param,param)Javaのハンドルを聞かせていると、標準のコンストラクタを呼び出すことができますオーデル。クラス階層に従うクラスは「is-a」関係に従うことに注意してください。


0

サブクラスのコンストラクターの最初の行はsuper()、スーパークラスのコンストラクターが呼び出されるようにするための呼び出しである必要があります。


違います。それは自動的に起こります。
マークピーターズ

デフォルトのコンストラクターがない場合でも?何を渡すかをどうやって知るのでしょうか?
robev 2010年

デフォルトのコンストラクターがない場合は、を呼び出す必要があります。を呼び出す必要はありsuper(some args)ませんsuper()。しかし、要点は、「しなければならない」は間違っているということです。スーパークラスのコンストラクターの1つは、クラスがコンパイルされる限り呼び出されることが保証されています。
マークピーターズ

super()を書いたとき、パラメーターのないコンストラクターを意味するのではなく、何も書きたくないということを明確にしませんでした。そして、はい、私はあなたがそれを呼び出す必要があることを意味しました、さもなければそれはコンパイルされません、それが私がしなければならないと言った理由です。
robev 2010年

1
繰り返しになりますが、親クラスに引数なしのコンストラクターが存在する場合は、スーパーコンストラクターを明示的に呼び出す必要はありません。スーパーコンストラクターは常に呼び出されますが、言い回しをすると、入れないとスーパーコンストラクターが呼び出されない危険があるように聞こえますsuper(...)。その危険性はまったくありません。コンパイルされないという危険があります。
マークピーターズ

0

super();にコメントして、試してみました。@MarkPetersが言ったようにコメントせずに同じことをします

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}

0

オラクルのドキュメントページから:

メソッドがそのスーパークラスのメソッドの1つをオーバーライドする場合、キーワードを使用してオーバーライドされたメソッドを呼び出すことができますsuper

使用することもできます super非表示のフィールドを参照するます(ただし、フィールドを非表示にすることはお勧めしません)。

superサブクラスのコンストラクターでの使用:

スーパークラスコンストラクターの呼び出しは、サブクラスコンストラクターの最初の行である必要があります。

スーパークラスコンストラクターを呼び出すための構文は次のとおりです。

super();  

または:

super(parameter list);

を使用するsuper()と、スーパークラスの引数なしコンストラクターが呼び出されます。とsuper(parameter list)と、パラメーターリストが一致するスーパークラスコンストラクターが呼び出されます。

注:コンストラクターがスーパークラスコンストラクターを明示的に呼び出さない場合、Javaコンパイラーはスーパークラスの引数のないコンストラクターへの呼び出しを自動的に挿入します。。スーパークラスに引数のないコンストラクターがない場合、コンパイル時エラーが発生します。

関連記事:

ポリモーフィズムvsオーバーライドvsオーバーロード

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.