web-dev-qa-db-ja.com

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

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

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

class A
{
    int k = 10;
}

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

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

77
muttley91

exactlyを呼び出すと、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");
    }
}
135
Mark Peters

superは、親クラスのconstructormethods、およびpropertiesの呼び出しに使用されます。

42
Zain Shaikh

サブクラスでメソッドをオーバーライドしたときに親クラスからメソッドを呼び出す場合は、サブクラスで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()行は、スーパークラスCellPhoneprint()メソッドを呼び出します。出力は次のようになります。

I'm a cellphone
I'm a touch screen cellphone
22
Dhiraj Shekar

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

http://download.Oracle.com/javase/tutorial/Java/IandI/super.html

9
Jon

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

例えば:

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

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

TheSubのインスタンスを作成すると、eatCake()eatMoreCake()の両方が呼び出されます

8
TartanLlama

super()を呼び出して、スーパークラスのコンストラクターを具体的に実行します。クラスに複数のコンストラクターがある場合、super()またはsuper(param,param)を使用して特定のコンストラクターを呼び出すことができ、Javaにそれを処理させて標準コンストラクターを呼び出すことができます。クラス階層に従うクラスは「is-a」関係に従うことに注意してください。

1
0xCAFEBABE

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

1
AHungerArtist

Superは親メソッドを呼び出します。参照: http://leepoint.net/notes-Java/oop/constructors/constructor-super.html

1
Ben Groot

Super()にコメントして、試しました。 @Mark Petersが言ったようにコメントせずに同じことをする

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
user2567665

Oracleのドキュメントから ページ

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

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

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

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

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

super();  

または:

super(parameter list);

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

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

関連記事:

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

0
Ravindra babu

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

0
robev