Javaのsuper()


回答:


267

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

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

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

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


9
注:最初のケースでは、親クラスには引数のないコンストラクターが必要であり、失敗するとコンパイルエラーがスローされます。
KNU 2014

Nit:親/子の用語は、クラス階層にはあまり適していません。(子供父親ではありません。)
aioobe 2015

superを使用できる場所に制限はありますか?
アーロンフランケ

2
@VivekChavda、生徒が先生になるのと同じように、子供親になることは確かです。犬は必ず動物です。親/子は、一般的にある持っている(「親は関係を持っている動物/犬がある一方で、子供を」)「である」関係。aioo.be/2016/06/29/a-child-is-not-always-a-parent.htmlを
aioobe

2
@AaronFranke、「スーパーを使用できる場所に制限はありますか?」-はい、super(...)コンストラクタの最初のステートメントとしてのみ使用できます。
aioobe 2017

154

いくつかの事実:

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

では、これらのポイントを実際に実装してみましょうsuper()

プログラム1とプログラム2の違いを確認してください。ここでは、プログラム2 super()がJavaでの最初のステートメントを証明しています。

プログラム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

ここでは2つの出力100と200を取得しています。Show()派生クラスの関数が呼び出されると、最初Show()に親クラスの関数が呼び出されます。これShow()は、派生クラスのShow()関数内で、super関数名の前のキーワード。


4
ソースコードの例をインデントしなかったのはなぜですか?特定の理由はありますか?
erikbwork

いいえerikb、私はsuper()の使用法を知りたいです。今後は私だけに行きます
Mohan

私の基本クラスでは、コンストラクタを1、2、...引数でオーバーロードします
Mohan

しかし、私の派生クラスでは、引数なしでsuper()を使用しています。次に、それが基本クラスのデフォルトコンストラクターを自動的に呼び出すかどうかによって何が起こるか
Mohan

2
super()はキーワードではありません。これはコンストラクター呼び出しです。superはキーワードであり、#1と#2はその定義でのみ意味があります。
ローンの侯爵2017年

37

ソース記事:Java:super()の呼び出し


はい。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.

私の基本クラスでは、コンストラクターを1、2、...引数でオーバーロードし、派生クラスでは引数なしでsuper()を使用しています。次に、それが基本クラスのデフォルトコンストラクターを自動的に呼び出すかどうかによって何が起こるか
Mohan

はい。super()呼び出すと、引数を取らないスーパークラスのコンストラクターが呼び出されます。同様に、次のようにすると、引数1のコンストラクタが呼び出さsuper(arg1)れます。
aioobe 2010

基本クラスに引数のないコンストラクターがない場合、派生クラスがsuper()を呼び出すとどうなりますか。
Mohan

1
何もない。コンパイルされません。コンストラクタを自分で指定すると、automatic / default / no-argument-constructorは生成super()されないため、有効な呼び出しではありません。
aioobe 2010

29

super()を使用して親コンストラクターを呼び出していますか?

はい。

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

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

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


5
super()親コンストラクタsuper.myMethod()を呼び出すために使用され、オーバーライドされたメソッドを呼び出すために使用されます。
ショーンパトリックフロイド

2
@seanizerまたはスーパークラスの他のメソッド(静的を含む)がスコープ内にある場合。superは、基本クラスへの参照にすぎません。
アタマンロマン2010

3
基本クラスのメソッドの呼び出しにsuper()が使用されているとは思いません。ただし、super.method()を使用できます。
Dheeraj Joshi、2009

@ seanizer、@ Dheeraj:あなたのフィードバックをありがとう、私は私の答えを採用しました。
ハインツィ

7

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

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

class Implicit {
    Implicit() {
    }
}

私はそれがいくつかのクラスで使用されているのを見つけました、目的が何であったかはわかりません。あなたの答えは役に立ちます。
iprashant 2017年

6

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

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

「Javaスーパー」の簡単なグーグルはこれで結果


4

それは正しいです。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に値を割り当てることができます。


2

私はすべての答えを見てきました。しかし、誰もが1つの非常に重要なポイントに言及するのを忘れていました。

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


1

ただ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.
   }

}

引数なし。
ローンの侯爵2017年

1

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

public class DeveloperSteps extends ScenarioSteps {

public DeveloperSteps(Pages pages) {
    super(pages);
}........

1

私が理解したことなら何でもコードと共有したいと思います。

javaのsuperキーワードは、親クラスオブジェクトを参照するために使用される参照変数です。主に次のコンテキストで使用されます:-

1.変数でのスーパーの使用:

class Vehicle 
{ 
    int maxSpeed = 120; 
} 

/* sub class Car extending vehicle */
class Car extends Vehicle 
{ 
    int maxSpeed = 180; 

    void display() 
    { 
        /* print maxSpeed of base class (vehicle) */
        System.out.println("Maximum Speed: " + super.maxSpeed); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String[] args) 
    { 
        Car small = new Car(); 
        small.display(); 
    } 
} 

出力:-

Maximum Speed: 120
  1. メソッドでのスーパーの使用:
/* Base class Person */
class Person 
{ 
    void message() 
    { 
        System.out.println("This is person class"); 
    } 
} 

/* Subclass Student */
class Student extends Person 
{ 
    void message() 
    { 
        System.out.println("This is student class"); 
    } 

    // Note that display() is only in Student class 
    void display() 
    { 
        // will invoke or call current class message() method 
        message(); 

        // will invoke or call parent class message() method 
        super.message(); 
    } 
} 

/* Driver program to test */
class Test 
{ 
    public static void main(String args[]) 
    { 
        Student s = new Student(); 

        // calling display() of Student 
        s.display(); 
    } 
}

出力:-

This is student class
This is person class

3.コンストラクターでのスーパーの使用:

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

/* subclass Student extending the Person class */
class Student extends Person 
{ 
    Student() 
    { 
        // invoke or call parent class constructor 
        super(); 

        System.out.println("Student class Constructor"); 
    } 
} 

/* Driver program to test*/
class Test 
{ 
    public static void main(String[] args) 
    { 
        Student s = new Student(); 
    } 
} 

出力:-

Person class Constructor
Student class Constructor

0

コンストラクターコンストラク
ターでは、ドットなしでそれを使用して別のコンストラクターを呼び出すことができます。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

スーパーキーワードは、スーパークラスのコンストラクタを呼び出すようにし、スーパークラスのメンバーを参照するために使用することができます

あなたが呼び出すと()スーパー右引数を指定して、我々は実際にコンストラクタ呼び出しボックスの変数の初期化、高さ深さを、対応するパラメータの値を使用して、それに言及しました。付加価値の重みを初期化するだけです。必要に応じて、変数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

スーパーはキーワードです。スーパークラスで定義されたメソッドを呼び出すために、サブクラスメソッド定義内で使用されます。スーパークラスのプライベートメソッドを呼び出すことはできません。superキーワードで呼び出すことができるのはpublicおよびprotectedメソッドのみです。また、親クラスのコンストラクターを呼び出すためにクラスコンストラクターによって使用されます。

詳細については、ここを確認してください。


0

前述のように、デフォルトのコンストラクターの内部には、コンストラクターの最初の行で呼び出される暗黙の super()があります。

このsuper()は、クラス階層の最上位で始まるコンストラクタのチェーンを自動的に呼び出し、階層を下に移動します。

プログラムのクラス階層に3 つ以上のクラスがある場合、最上位クラスのデフォルトコンストラクターが最初呼び出され ます。

これの例は次のとおりです。

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