Javaでどのメソッドが動的にバインドされているかという質問は何ですか?どのメソッドがJavaで動的にバインドされていますか?
私が間違っていないと、ほとんどのメソッドは静的にバインドされていますが、いくつかの例外があります。
Javaでどのメソッドが動的にバインドされているかという質問は何ですか?どのメソッドがJavaで動的にバインドされていますか?
私が間違っていないと、ほとんどのメソッドは静的にバインドされていますが、いくつかの例外があります。
インスタンスメソッド呼び出しは実行時に解決され、静的メソッド呼び出しはコンパイル時に解決されます。
理論的には、すべてのメソッドは、実行時に動的に、
を除いて、拘束されていますJVMは、ロードされたクラスがない場合など、静的に解決されるメソッド呼び出しをJITコンパイルすることを選択することがありますこれは、オーバーライドするメソッドを含んでいます。
非公開のマーク付きのメソッド親クラスも静的にバインドされています – NullUserException
@ Nullありがとう、私はそれを忘れていました。 – Oak
一般的に、それはthieのように考えることができます: コンパイル時に、コンパイラは静的バインディングをチェックします。 実行時にダイナミックタイプがチェックされます。例のため
:の静的タイプはAであり、A 'はXと呼ばれる機能を有しているが、実行時に存在Bオブジェクトを認識し、そして印刷されるため、1
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();
はコンパイルが、runntime例外がスローされます。
この記事を見てください:http://geekexplains.blogspot.com/2008/06/dynamic-binding-vs-static-binding-in.html –
Java非静的メソッドは、デフォルトでは仮想です。ジットは、これを行うことに伴うオーバーヘッドを最小限に抑えるようにコードを最適化します。例えば、仮想メソッドをインライン化することができます。 –
http://download.oracle.com/javase/tutorial/javabeans/properties/bound.html http://download.oracle.com/javase/tutorial/uiswing/concurrency/bound.html –