web-dev-qa-db-ja.com

Javaのsuper()

super()は親コンストラクタを呼び出すために使用されますか? super()を説明してください。

209
Mohan

super()は引数なしで親コンストラクタを呼び出します。

引数とともに使用することもできます。すなわちsuper(argument1)と、argument1型のパラメータを1つ受け入れるコンストラクタを呼び出します(存在する場合)。

また、親からメソッドを呼び出すためにも使用できます。すなわちsuper.aMethod()

詳細情報とチュートリアル はこちら

249
pakore

いくつかの事実:

  1. super()は、直接の親を呼び出すために使用されます。
  2. super()はインスタンスメンバー、すなわちインスタンス変数とインスタンスメソッドで使用できます。
  3. super()は、親クラスのコンストラクターを呼び出すためにコンストラクター内で使用できます。

さて、今度は実際にこれらのsuper()のポイントを実装しましょう。

プログラム1と2の違いをチェックしてください。ここで、プログラム2は、Javaにおける最初のsuper()の文を証明しています。

プログラム1

class Base
{
    int a = 100;
}

class Sup1 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup1().Show();
    }
}

出力:

200
200

それではプログラム2をチェックして、主な違いを見つけてみてください。

プログラム2

class Base
{
    int a = 100;
}

class Sup2 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(super.a);
        System.out.println(a);
    }
    public static void main(String[] args)
    {
        new Sup2().Show();
    }
}

出力:

100
200

プログラム1では、出力は派生クラスのみでした。基本クラスも親クラスも変数を表示できませんでした。しかし、プログラム2では、出力を印刷するときにsuper()を変数aとともに使用し、派生クラスの変数aの値を印刷する代わりに、基本クラスの変数aの値を印刷しました。したがって、super()が直接の親を呼び出すために使用されていることがわかります。

さて、プログラム3とプログラム4の違いを調べてください。

プログラム3

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup3 extends Base
{
    int a = 200;
    void Show()
    {
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup3().Show();
    }
}

出力:

200

ここでの出力は200です。Show()を呼び出したときに、派生クラスのShow()関数が呼び出されました。しかし、親クラスのShow()関数を呼び出したい場合はどうすればいいですか。解決策についてはプログラム4をチェックしてください。

プログラム4

class Base
{
    int a = 100;
    void Show()
    {
        System.out.println(a);
    }
}

class Sup4 extends Base
{
    int a = 200;
    void Show()
    {
        super.Show();
        System.out.println(a);
    }
    public static void Main(String[] args)
    {
        new Sup4().Show();
    }
}

出力:

100
200

派生クラスのShow()関数が呼び出されると、最初に親クラスのShow()関数が呼び出されます。これは、Show()関数の内部にあるためです。派生クラスの場合は、関数名の前にsuperキーワードを置くことによって、親クラスのShow()関数を呼び出しました。

149
SimonGates

はい。 super(...)はスーパークラスのコンストラクタを呼び出します。

この例を見てください。

class Animal {
    public Animal(String arg) {
        System.out.println("Constructing an animal: " + arg);
    }
}

class Dog extends Animal {
    public Dog() {
        super("From Dog constructor");
        System.out.println("Constructing a dog.");
    }
}

public class Test {
    public static void main(String[] a) {
        new Dog();
    }
}

プリント:

Constructing an animal: From Dog constructor
Constructing a dog.
33
aioobe

Super()は親コンストラクタを呼び出すために使用されますか?

はい。

PlsはSuper()について説明しています。

super()は、パラメータなしの親コンストラクタを呼び出すsuperキーワードの特別な用途です。一般に、superキーワードは、オーバーライドされたメソッドの呼び出し、隠しフィールドへのアクセス、またはスーパークラスのコンストラクタの呼び出しに使用できます。

これが 公式チュートリアルです

28
Heinzi

はい、super()(小文字)は親クラスのコンストラクタを呼び出します。引数を含めることができます:super(foo, bar)

スーパークラスのメソッドを呼び出すためにメソッドで使用できるsuperキーワードもあります。

"Java super"のクイックグーグルは this になります

5
Bozho

引数のないスーパーコンストラクタを呼び出すことは、画面スペースとプログラマの時間を無駄にするだけです。ユーザーが作成したかどうかにかかわらず、コンパイラはまったく同じコードを生成します。

class Explicit() {
    Explicit() {
        super();
    }
}

class Implicit {
    Implicit() {
    }
}
5
Roland Illig

それは正しいです。 Superは、親コンストラクタを呼び出すために使用されます。だからあなたはそのようなコードブロックがあるとします

class A{
    int n;
    public A(int x){
        n = x;
    }
}

class B extends A{
    int m;
    public B(int x, int y){
        super(x);
        m = y;
    }
}

その後、メンバー変数nに値を代入できます。

3
Sagar V

ただsuper();クラスのスーパークラスが存在する場合は、単独でデフォルトのコンストラクタが呼び出されます。しかし、あなたは明示的にデフォルトコンストラクタを自分で書かなければなりません。 Javaを実装していなくてもJavaが生成されない場合は、super()を保存してください。ユニバーサルスーパークラスオブジェクトを参照すると、サブクラスで呼び出すことはできません。

public class Alien{
   public Alien(){ //Default constructor is written out by user
   /** Implementation not shown…**/
   }
}

public class WeirdAlien extends Alien{
   public WeirdAlien(){
   super(); //calls the default constructor in Alien.
   }

}
1
WIll

たとえば、Seleniumオートメーションでは、親のコンストラクタを次のように使用できるPageObjectがあります。

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........
1
Todd Zhang

私はすべての答えを見ました。しかし、誰もが一つの非常に重要な点を述べるのを忘れていました:

super()は、コンストラクタの最初の行で呼び出すか使用する必要があります。

1
Pritam Banerjee

superはキーワードです。スーパークラスで定義されたメソッドを呼び出すために、サブクラスのメソッド定義内で使用されます。スーパークラスのプライベートメソッドは呼び出せません。 superキーワードで呼び出すことができるのは、パブリックメソッドと保護されたメソッドだけです。また、クラスコンストラクターがその親クラスのコンストラクターを呼び出すためにも使用されます。

さらなる説明はここ をチェックしてください

0
otoloye

述べたように、デフォルトのコンストラクタの中にはimplicitsuper()が/で呼ばれていますコンストラクタの最初の行

このsuper()は、クラス階層の最上位から自動的に一連のコンストラクタを呼び出し、階層の下に移動します。

プログラムのクラス階層に2つより多いクラスがある場合、トップクラスのデフォルトコンストラクタはcalledとなります。first

これはこの例です:

class A {
    A() {
    System.out.println("Constructor A");
    }
}

class B extends A{

    public B() {
    System.out.println("Constructor B");
    }
}

class C extends B{ 

    public C() {
    System.out.println("Constructor C");
    }

    public static void main(String[] args) {
    C c1 = new C();
    }
} 

上記のように出力されます。

Constructor A
Constructor B
Constructor C
0
Mark Burleigh

superキーワードを使用して、スーパークラスコンストラクターを呼び出したり、スーパークラスのメンバーを参照したりできます。

正しい引数を指定してsuper()を呼び出すと、実際にはコンストラクタが呼び出されます。ボックス、変数を初期化するwidth高さおよび深さ、対応するパラメータの値を使用して参照しました。あなたはその付加価値重量を初期化するために残るだけです。必要であれば、クラス変数Boxをprivateとすることもできます。 Boxクラスのプライベート修飾子のフィールドに入力して、問題なくアクセスできることを確認します。

スーパークラスでは、オーバーロードされたバージョンのコンストラクタをいくつか指定できます。そのため、さまざまなパラメータを使用してメソッドsuper()を呼び出すことができます。プログラムは、指定された引数に一致するコンストラクターを実行します。

public class Box {

    int width;
    int height;
    int depth;

    Box(int w, int h, int d) {
        width = w;
        height = h;
        depth = d;
    }

    public static void main(String[] args){
        HeavyBox heavy = new HeavyBox(12, 32, 23, 13);
    }

}

class HeavyBox extends Box {

    int weight;

    HeavyBox(int w, int h, int d, int m) {

        //call the superclass constructor
        super(w, h, d);
        weight = m;
    }

}
0
Luchnik

コンストラクタ
コンストラクタでは、ドットなしでそれを使用して別のコンストラクタを呼び出すことができます。 superはスーパークラスのコンストラクタを呼び出します。 thisは、このクラスのコンストラクタを呼び出します。

public MyClass(int a) {
  this(a, 5);  // Here, I call another one of this class's constructors.
}

public MyClass(int a, int b) {
  super(a, b);  // Then, I call one of the superclass's constructors.
}

superは、スーパークラスがそれ自身を初期化する必要がある場合に便利です。 thisは、すべてのハード初期化コードを1つのコンストラクタに1回だけ記述し、それを他のすべてのはるかに記述しやすいコンストラクタから呼び出すことを可能にするのに役立ちます。

メソッド
どのメソッドでも、ドット付きでそれを使って別のメソッドを呼び出すことができます。 super.method()はスーパークラスのメソッドを呼び出します。 this.method()はこのクラスのメソッドを呼び出します。

public String toString() {
  int    hp   = this.hitpoints();  // Calls the hitpoints method in this class
                                   //   for this object.
  String name = super.name();      // Calls the name method in the superclass
                                   //   for this object.

  return "[" + name + ": " + hp + " HP]";
}

superは特定のシナリオで役に立ちます。あなたのクラスがあなたのスーパークラスと同じメソッドを持っているなら、Javaはあなたがあなたのクラスのものを望んでいると思います。 superを使うと、代わりにスーパークラスのメソッドを要求することができます。 thisはあなたのコードをもっと読みやすくする方法としてのみ役に立ちます。

0
Olathe