0

Java で次のクラス用に生成されたコードに違いはありますか。

class A_noConstructor
{
    public static int par1;
    public static int par2;

    void method1(){
    }
    void method2(){
    }

}

class A_wConstructor 
{
    public static int par1;
    public static int par2;

    public A_wConstructor(){
    }

    void method1(){
    }

    void method2(){
    }

}

class B_noConstructor 
{
    void method1(){
    }
    void method2(){
    }

    public static int par1;
    public static int par2;

}


class C_noConstructor 
{
    public static int par1;
    void method1(){
    }
    public static int par2;
    void method2(){
    }

}

クラス A_noConstructor を B_noConstructor または C_noConstructor で直接置き換えると、par1 と par2 はすべての場合で同じメモリ アドレスになりますか? コンパイラはこれらのクラスに対して異なる方法でソースを解析するため、これらのクラスに対してコンパイラによって生成されるシンボル テーブルに違いはありますか?

編集: void A_wConstructor() が public A_wConstructor(); に変更されました。

4

2 に答える 2

0

答えはコンパイラに大きく依存します。同じソースコードをマシンコードで表現する方法はたくさんあり、コンパイラーには違いを生む最適化オプションなどがあります。したがって、生成されるコードが特定のケースで同じである可能性があるからといって、それが常に真であるとは言えません。

于 2013-05-26T09:26:20.190 に答える
0

作成するクラス (引数なしのコンストラクターのみ) とコンストラクターなしで作成するクラスに違いはありません。いずれにせよ、コンパイラはSYNTHESIZED DEFAULT CONSTRUCTORのコンストラクタを 1 つ作成します。

ただし、順序によって多少の違いが生じる可能性があります (ただし、明示的ではありません。私たちにとっては違いはありません) シンボル テーブルは、解析の順序で更新されます (リテラル、変数などを追加します)。

順序だけが異なり、メモリアドレスが変わる可能性がありますが、テーブルエントリに関連付けられています。そのため、関数を単独で呼び出すのに役立ちます。パフォーマンスの問題や違いは発生しないと思います。

于 2013-05-26T09:26:41.897 に答える