6

重複の可能性:
オーバーライドされていないスーパークラス メソッドにアクセスするときの「super」キーワードの使用

私はJavaが初めてで、言語についての知識と経験を得るために最近Javaについてたくさん読んでいます。コンパイラが自動コードを挿入するときの継承されたメソッドとクラスの拡張について質問があります。

checkDuePeriod()と呼ばれるメソッドを含むいくつかのメソッドでクラス A を作成し、クラス A とそのメソッドを拡張するクラス B を作成する場合を読んでいます。

次に、構文checkDuePeriod()を使用せずにクラス B 内でメソッドを呼び出すと、コンパイル中にコンパイラはbeforeを含めますか、またはクラスをコンパイルするときにコンパイラがコンストラクタを自動的に含めるという事実は、クラス B がクラス A から呼び出すメソッドの呼び出しを意味します?super.checkDuePeriod()super.checkDuePeriod()super()super.

私はこれについて少し混乱しています。前もって感謝します。

4

4 に答える 4

5

通常のメソッドのスーパー クラスの実装は、サブクラスで自動的に呼び出されませんが、スーパー クラスのコンストラクターの形式をサブクラスのコンストラクターで呼び出す必要があります。

super()スーパークラスにデフォルトの (パラメーターなしの) コンストラクターがある場合など、場合によっては、への呼び出しが暗示されます。ただし、スーパークラスにデフォルトのコンストラクターが存在しない場合、サブクラスのコンストラクターはスーパークラスのコンストラクターを直接的または間接的に呼び出す必要があります。

デフォルトのコンストラクターの例:

public class A {
    public A() {
        // default constructor for A
    }
}

public class B extends A {
    public B() {
        super(); // this call is unnecessary; the compiler will add it implicitly
    }
}

デフォルトコンストラクタのないスーパークラス:

public class A {
    public A(int i) {
        // only constructor present has a single int parameter
    }
}

public class B extends A {
    public B() {
        // will not compile without direct call to super(int)!
        super(100);
    }
}
于 2012-10-17T04:04:14.587 に答える
1

If you call checkDuePeriod()in B without , は、B の this インスタンス ( B 内でsuper.表される) に属するメソッドを呼び出したいことを意味します。つまり、 と言うのと同じなので、コンパイラが追加しても意味がありません。フロント。thisthis.checkDuePeriod()super.

super.A のバージョンのメソッドを呼び出すことをコンパイラに伝えるために明示的に追加する必要があるものです (B が A によってメソッドに提供された実装をオーバーライドした場合に特に必要です)。

于 2012-10-17T04:22:07.893 に答える
1

デフォルトのコンストラクター (引数のないコンストラクター) としての super() の呼び出しは、直接的または非直接的に行うことができますが、拡張可能なクラスのフィールドが適切に初期化されることを保証します。

例えば:

public class A {
    StringBuilder sb;
    public A() {
        sb = new StringBuilder();
    }
}

public class B extends A {
    public B() {
        //the default constructor is called automatically
    }
    public void someMethod(){
        //sb was not initialized in B class, 
        //but we can use it, because java garants that it was initialized
        //and has non null value
        sb.toString();
    }
}

ただし、メソッドの場合:

メソッドはいくつかのロジックを実装します。そして、使用するスーパークラスのロジックを書き直す必要がある場合

public class B extends A {
    public B() {
    }
    public boolean checkDuePeriod(){
       //new check goes here
    }
}

スーパークラスの checkDuePeriod() から返された値を使用して、追加のチェックを実装したい場合は、次のようにする必要があります

public class B extends A {
    public B() {
    }
    public boolean checkDuePeriod(){
       if(super.checkDuePeriod()){
            //extra check goes here
       }else{
            //do something else if need
       }
       return checkResult;
    }
}
于 2012-10-17T04:22:08.933 に答える
0

まずについてConstructors

-objectクラスの が作成されるたびに、そのconstructorが初期化され、その時点ですぐconstructorその のがクラスまでuper-class呼び出されます。Object

-このプロセスでは、すべてのインスタンス変数が宣言され、初期化されます。

-このシナリオを検討してください。

イヌイヌ科sub-class、イヌ科はアニマルsub-class

Dog オブジェクトが初期化されると、オブジェクトが実際に形成される前に、Canine クラスのオブジェクトが形成されている必要があり、Canine オブジェクトが形成される前に Animal クラスのオブジェクトが形成され、その前に Object クラスのオブジェクトが形成されている必要があります。

したがって、形成されるオブジェクトのシーケンスは次のとおりです。

Object ---> Animal ---> Canine ---> Dog

だからConstructor of the Super-Class is Called before the Sub-Class

今ではMethod

The most specific version of the method that class is called.

例えば:

public class A{

  public void go(){


  }

}

class B extends A{



   public static void main(String[] args){

   new B().go();  // As B has not overridden the go() method of its super class,
           // so the super-class implementation of the go() will be working here
    }
}
于 2012-10-17T05:05:45.237 に答える