4

これは動的ディスパッチですか:

abstract class A{
    public method Meth1(){
    //somecode
    }
}

class B extends A{
}

class C extends A{
}

完全に別のクラスで:

Some_Method(A a){
    a.Meth1();
}

動作が両方のサブクラスで同じであるため、これが動的ディスパッチであるかどうかはわかりませんか?

そうでない場合、動作がサブクラスごとに定義されている場合、動的ディスパッチになりますか?

4

4 に答える 4

2

あなたが特定の質問について何を言っているかはわかりませんが(呼び出されたメソッドが1つのクラスで宣言されていることが静的にわかっている場合は、ランタイムタイプのチェックをバイパスする実装固有の最適化がある可能性があります)、実際、動的ディスパッチによりMeth1実行時に決定されるメソッドの実際の実装。したがって、現在、オーバーライドBCオーバーライドもされていない場合でもMeth1、後でオーバーライドされた場合、動的ディスパッチにより、仮パラメータの実行時型がである場合、実際の実装はであることが保証さaBますB。同様に。の場合C

これを、宣言されたタイプの使用済み引数に基づいてコンパイル時に実際のメソッドが決定されるJavaのメソッドオーバーロードと比較してください。

public class Overloading {

  public static class User {}
  public static class Admin extends User {}

  public static String foo(User user) {
    return "User specific method";
  }

  public static String foo(Admin admin) {
    return "Admin specific method";
  }

  // This will print "User specific method" two times, because both
  // user1 and user2 have same compile time type, i.e., User. Runtime
  // type does not matter.
  public static void main(String[] args) {
    User user1 = new User();
    System.out.println(foo(user1));

    User user2 = new Admin();
    System.out.println(foo(user2));
  }
}
于 2011-08-20T16:27:34.207 に答える
0

はい、そうです!。

Java では、すべてのインスタンス メソッドがデフォルトで仮想であるためです。( Java で仮想関数/メソッドを記述できますか? )

次に、実行時に a.Meth1() を実行する必要があることを解決します。そのメソッドのオーバーライドを持つ A から派生したクラスを使用して、新しい JAR を動的にロードできることに注意してください。

于 2016-05-07T13:51:47.327 に答える
-1

動的ディスパッチは、宣言されたタイプではなく、実際のタイプに基づいてメソッドの実装が選択される場合です。Javaは、リフレクションを除いて、動的ディスパッチをサポートしていません。これは静的に型付けされたポリモーフィックディスパッチです。

単一の実装がロードされている場合、JVMはモモモーフィック最適化を適用し(非常に高速な呼び出しを生成します)、JVMが同じコードに渡された2番目の実装を確認すると元に戻されます。

JVMで動的ディスパッチを実装する新しい「invokedynamic」バイトコードについて聞いたことがあるかもしれませんが、これは他のJVM言語で使用することを目的としており、Javaプログラムはバイトコード生成を行う場合を除いてそれを使用しません。

[編集]簡単な例を次に示します。

Collection<Integer> c = new ArrayList<Integer>(Arrays.asList(2, 1, 0));
c.remove(2); // Collection.remove(E element) or List.remove(int idx)?
assert c.equals(Arrays.asList(1, 0)); // passes in case of static dispatch
assert c.equals(Arrays.asList(2, 1)); // fails - would pass in case of dynamic dispatch
于 2011-08-20T16:10:07.397 に答える