1

Java で動的にバインドされるメソッドはどれですか?

C++ から来て、私が間違っていなければ、ほとんどのメソッドはいくつかの例外を除いて静的にバインドされています。

4

3 に答える 3

4

理論的には、すべてのメソッドは動的にバインドされます。

  • 静的メソッド
  • コンストラクター
  • プライベートメソッド
  • 最終的な方法

実際には、実行時に、JVMは、静的に解決されるいくつかのメソッド呼び出しをJITコンパイルすることを選択する場合があります。たとえば、オーバーライドするメソッドを含むロードされたクラスがない場合などです。

于 2011-09-17T08:25:31.047 に答える
3

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

于 2011-09-17T08:20:12.323 に答える
0

一般に、これは次のように考えることができます。コンパイル時に、コンパイラは静的バインディングをチェックします。実行時に、動的タイプがチェックされます。

例えば:

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
}
  • in 1は、aの静的タイプがAであり、AにXという関数があるためコンパイルされますが、実行時にBオブジェクトが認識され、「y」が出力されます。
  • 2では、aはタイプAであり、クラスAにはmという関数がないため、コンパイルエラーが発生します。
  • 3では、その継承B-> Aが正当であるかどうかがチェックされ、次にクラスBにmという関数があるかどうかがチェックされます。

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

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

コンパイルされますが、実行時例外がスローされます。

于 2011-09-17T09:15:59.647 に答える