0

知るために2〜3時間経った後、 compile-time と run-timeの違いは何ですか。最後に、私はこれを思いつきました。

実行時に割り当てられるメモリは、実行時/動的バインディングと呼ばれ、コンパイル時に割り当てられるメモリは、コンパイル時/静的バインディングと呼ばれます。

そして、私はこの例を試しました

class myclass {

    void here() {
        System.out.println("Here from myclass !!");
    }

    void here(int i) {
        System.out.println("Here !!" + i);
    }
}

class thisclass extends myclass {

    void here() {
        System.out.println("Here from thisclass !!");
    }
}

public class poly {

    public static void main(String s[]) {
        myclass m= new myclass();
        myclass a= new thisclass();
        m.here();
        m.here(12);
        a.here();
        a.here(13);
    }
} 

myclass a= new thisclass();そのため、これは実行時バインディングと見なされることもわかりました。aが のオブジェクトであるためmyclass、突然コンパイラがクラスの不一致を発見しました。したがって、オブジェクトの空間を動的にバインドしthisclassます。

それで、ここまで、私は物事を手に入れました。しかし、別の一般的な答えは、コンパイル時間のオーバーロードとランタイム参照のオーバーライドであることがわかりました。この点がわかりませんでした。

thisclass a= new thisclass();
a.here();

これは実行時バインディングとも呼ばれますか。?? ここに何か間違ったことを書いた場合は、私を修正してください。

4

3 に答える 3

4

まず、メモリ割り当てはこの図にはありません。コンパイル時のメモリ割り当てはありません。

この質問は、コンパイル時と静的バインディング、実行時と動的バインディングを混同しています。

静的バインディングはコンパイル時に発生します。動的バインディングは実行時に発生します。

今、あなたが書くとき

myclass m= new thisclass();
m.here(18);

コンパイル時に何が起こるかは、メソッドシグネチャの解決です。つまり、呼び出しhere(int)ており、その選択が最終的なものです。これは「静的バインディング」と呼ばれます。実行時に行われるのは、メソッドのディスパッチhere(int)です。実行時は、によって参照されるオブジェクトの実行時タイプに適した実装を選択しますmmyclass.m(int)との 2 つの方法から選択できますthisclass.m(int)。この特定の例では、ランタイムは後者を選択します。これは「動的バインディング」と呼ばれます。

あなたの質問については、「動的バインディングの強制をオーバーライドしています」... Java言語仕様では、実行時に呼び出す正しいメソッドを選択するためのルールが規定されています。これらの規則は、一般的な場合の「動的バインディング」と呼ばれる手順を意味します。しかし、実行時に特定のプロセスが常に発生するかどうかを尋ねている場合、話は異なります。最適化 JIT コンパイラーは、単一の選択肢をハードコーディングする「モノモーフィック呼び出しサイト」から選択して出力するメソッドが 1 つしかないことを確認できます。さらに、メソッド全体を呼び出し元にインライン化して、呼び出し自体を削除することもできます。

于 2012-11-05T13:30:17.860 に答える
0

これ:

thisclass a= new thisclass();
a.here();

コンパイラは呼び出す here() メソッド (thisclass のメソッド) を認識しているため、実行時バインディングではありません。しかし、あなたが言うなら:

myclass a= new thisclass();
a.here();

次に、実行時バインディングになります。

PS: クラス名は大文字で始める必要があります。

于 2012-11-05T13:17:32.937 に答える
0

しかし、別の一般的な答えは、コンパイル時間を参照するオーバーロードと実行時間を参照するオーバーライドであることがわかりました。この点がわかりませんでした。

オーバーロードとは、同じクラスに異なるパラメーターを持つ複数のメソッドを持つことを意味します。この時点で引数が指定されるため、どのメソッドが呼び出されるかはコンパイル時にわかります。

オーバーライドとは、サブクラスの親クラスからメソッドを再定義することを意味します。

于 2012-11-05T13:30:43.057 に答える