Java で動的にバインドされるメソッドはどれですか?
C++ から来て、私が間違っていなければ、ほとんどのメソッドはいくつかの例外を除いて静的にバインドされています。
Java で動的にバインドされるメソッドはどれですか?
C++ から来て、私が間違っていなければ、ほとんどのメソッドはいくつかの例外を除いて静的にバインドされています。
理論的には、すべてのメソッドは動的にバインドされます。
実際には、実行時に、JVMは、静的に解決されるいくつかのメソッド呼び出しをJITコンパイルすることを選択する場合があります。たとえば、オーバーライドするメソッドを含むロードされたクラスがない場合などです。
インスタンスメソッド呼び出しは実行時に解決され、静的メソッド呼び出しはコンパイル時に解決されます。
一般に、これは次のように考えることができます。コンパイル時に、コンパイラは静的バインディングをチェックします。実行時に、動的タイプがチェックされます。
例えば:
Class A{
public void function x(){ print("x"); }
}
Class B extends A{
public void function x(){ print("y"); }
public void function m(){ print("m"); }
}
public static void main(){
A a = new B();
a.x(); //1
a.m(); //2
((B)a).m(); //3
}
*キャストの最後のケースでは、コンパイラは継承の可能性のみをチェックし、Bオブジェクトは存在しないことに注意してください。例えば:
A a = new A();
((B)a).m();
コンパイルされますが、実行時例外がスローされます。