1

メソッド呼び出しが動的にバインドされている場合、コンパイラが不平を言う理由

メソッド run() はタイプ B に対して未定義です

コンパイラがクラス b で実行されるメソッドの存在をチェックするのはなぜですか

ここにコードがあります

import java.lang.*;

public class Program
{
    public static void main(String [] args) 
    { 
        B a = new A(); 
          a.run();//compiler complains at this line.
        a.p(10);  
        a.p(10.0); 
    } 
} 
    class B { 
        public void p(int i) 
        { 
            System.out.println(i*2); 
        } 
    }

    class A  extends B{ 
        public void p(int i) 
        { 
            System.out.println(i); 
        } 
        public void run(){

        }
    } 
4

3 に答える 3

3

Java は設計上、静的に型付けされた言語です。つまり、コンパイラは、そのメソッドの実装がすべての具象オブジェクトに存在することを認識し、保証できる必要があります。(Maxim Shoustin の回答は、この設計上の決定の背後にある理由を例で非常にうまく示しています。)

未知のオブジェクトがたまたま特定のメソッドを持っているという保証なしにコンパイラが想定した場合、Java はダック型言語になります。これには独自の利点がある可能性がありますが、Java の設計目標に沿ったものではありませんでした。

実際には、静的に型付けされた言語では、仮想 (非最終を意味する) メソッド (メソッドなどrun()) は動的に解決されますが、それらを解決するために使用される戦略はコンパイル時に記述されます。その戦略には、たとえば、ポリモーフィズムの多くの実装で、vTable (そのオブジェクトの仮想メソッドの実際の実装のアドレスを含むテーブル) の正しいオフセットを読み取ることが含まれる場合があります。動的ディスパッチ中のパフォーマンス。

于 2013-09-14T20:14:43.607 に答える