2011-09-17 7 views
1

Javaでどのメソッドが動的にバインドされているかという質問は何ですか?どのメソッドがJavaで動的にバインドされていますか?

私が間違っていないと、ほとんどのメソッドは静的にバインドされていますが、いくつかの例外があります。

+4

この記事を見てください:http://geekexplains.blogspot.com/2008/06/dynamic-binding-vs-static-binding-in.html –

+2

Java非静的メソッドは、デフォルトでは仮想です。ジットは、これを行うことに伴うオーバーヘッドを最小限に抑えるようにコードを最適化します。例えば、仮想メソッドをインライン化することができます。 –

+0

http://download.oracle.com/javase/tutorial/javabeans/properties/bound.html http://download.oracle.com/javase/tutorial/uiswing/concurrency/bound.html –

答えて

3

インスタンスメソッド呼び出しは実行時に解決され、静的メソッド呼び出しはコンパイル時に解決されます。

3

理論的には、すべてのメソッドは、実行時に動的に、

  • 静的メソッド
  • コンストラクタ
  • プライベートメソッド
  • 決勝方法実際に

を除いて、拘束されていますJVMは、ロードされたクラスがない場合など、静的に解決されるメソッド呼び出しをJITコンパイルすることを選択することがありますこれは、オーバーライドするメソッドを含んでいます。

+0

非公開のマーク付きのメソッド親クラスも静的にバインドされています – NullUserException

+0

@ Nullありがとう、私はそれを忘れていました。 – Oak

0

一般的に、それは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 
} 
  • がコンパイルされますy '
  • 2でコンパイルエラーが発生する。なぜなら、aはA型で、Aはmという関数がないからである。
  • 3の場合、継承B-> Aが正当であるかどうか、そしてクラスBがmという関数を持つかどうかがチェックされます。

*最後のキャストのケースでは、コンパイラは継承の可能性のみをチェックし、Bオブジェクトは存在しないことに注意してください。例えば :

A a = new A(); 
((B)a).m(); 

はコンパイルが、runntime例外がスローされます。

関連する問題