私はここで回答のほとんどに同意する必要があります -
誰もがJavaが遅くて、実行時にメソッドの実装上でゼロの面で何を呼び出しますバインディングが、私の意見では、Javaが何をするための用語バインディングを使用するのは正しくありません。
レイトバインディングは、コンパイル時にメソッド呼び出しのチェックが全く行われていないことを意味し、メソッドが存在しない場合はコンパイルエラーは発生しません。
ただし、メソッド呼び出しを修飾する型の型階層のどこかにメソッドが存在しない場合、Javaはコンパイルエラーをスローします(ここでの動作を説明するときは多少近似しています)。これは純粋な伝統的な晩年の結束ではない 通常の非プライベートで非最後の非静的メソッド呼び出しでJavaが行うことは、動的ディスパッチと呼ばれることがあります。
しかし、リフレクションをJavaで使用すると、コンパイラは呼び出されたメソッドが存在するかどうかを単に検証できないため、Javaは純粋なレイトバインディングを実行します。 が次に例を示します。
class A
{
public void foo()
{
System.out.println("Foo from A");
}
}
class B extends A
{
public void foo()
{
System.out.println("Foo from B");
}
}
public class C
{
public static void main(String [] args)
{
A a=new A();
B b=new B();
A ref=null;
Class ref1 = null;
ref1 = b.getClass();
ref.foo1();//will not compile because Java in this normal method
//call does some compile time checks for method and method
//signature existence. NOT late binding in its pure form.
try {
ref1.getMethod("foo1").invoke(null); //will throw a
//NoSuchMethodException at runtime, but compiles perfectly even
//though foo1 does not exist. This is pure late binding.
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
わからないのパフォーマンスは本当に言語のように異なる特徴を比較するときに考慮に入れるための最良の寸法であり、彼らはさまざまな問題を解決することを目指して... –