1

メソッドの動作が実装されている抽象クラスがある場合、および動作が実装されていない場合のメソッド呼び出しの順序はどのようになっていますか?

私の抽象クラスがAbsと呼ばれ、Sub1とSub2の2つのサブクラスがあるとします。

ケース1の場合、AbsにはメソッドMeth1の実装コードが含まれています

public abstract class Abs{

  public void Meth1(){
    //Some code
  }
}

完全に異なるクラスで、私はメソッドを持っています:

MyMethod(Abs a){
  a.Meth1();
}

ここで、Absの代わりにSub1またはSub2のいずれかを渡します

ケース2の場合、Absには実装コードが含まれていません(ただし、Sub1とSub2には含まれています)

public abstract class Abs{

  public abstract void Meth1();
}

そして私は同じことを呼びます:

MyMethod(Abs a){
  a.Meth1();
}

Sub1またはSub2のいずれかを渡した後。

それぞれの場合のメソッド呼び出しの順序は何ですか?それは常にスーパークラスのAbsに行き、次にサブクラスに行きますか?サブクラスがパラメーターとして渡されたため、最初にサブクラスに移動しますか?次に、JVMはサブクラスに実装コードが提供されているかどうかを確認し、提供されていない場合は、実装コードがある場合はスーパークラスメソッドが呼び出されますか?

4

2 に答える 2

3

サブクラスがメソッドをオーバーライドする場合、サブクラスに呼び出しがない限り、親メソッドの実装はまったく呼び出されませんsuper.overridenMethodName()。オーバーライドされたメソッド実装の最初または最後、または他の場所に配置できます。

一方、抽象クラスに抽象メソッドがある場合、サブクラスはコンパイル時にそれを実装して何らかのロジックを提供するように強制されます。

于 2011-08-20T14:12:48.780 に答える
0

非静的メソッドmの場合、メソッド呼び出し式o.m()は、 によって参照されるオブジェクトの実行時クラスを決定することによって実行されoます。次に、そのクラスのメソッド実装 (クラス自体で継承または定義) が呼び出されます。

すべてのクラスは、同じシグネチャを持つメソッドを宣言しない限り、そのスーパー クラスからすべての (可視の) メソッドを継承します。その場合、宣言されたメソッドの実装は、代わりに継承されたものをオーバーライドします。

別の言い方をすれば、最も具体的なスーパー クラスの実装が呼び出されます。それだけです。特に、そのメソッドの継承された実装は自動的には呼び出されません。もちろん、呼び出されたメソッドは、 を使用して、継承されたメソッドの実装を呼び出すことができsuper.m()ます。

staticメソッドの呼び出しではルールが異なることに注意してください。また、レシーバーのランタイム クラス (oこの例では) が呼び出されるメソッドを決定しますが、オーバーロードはパラメーターのランタイム タイプではなく、コンパイル時のタイプを使用して解決されます。

于 2011-08-20T15:45:01.187 に答える