動的ディスパッチは、宣言されたタイプではなく、実際のタイプに基づいてメソッドの実装が選択される場合です。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