2

重複の可能性:
java: 通常の 1 よりも final static int = 1 を使用していますか?

さて、次の違いを知りたいと思います: final int a=10; 最終的な静的 int a=10; それらがクラスのメンバー変数である場合、それらは両方とも同じ値を保持し、実行中にいつでも変更できません。静的変数がすべてのオブジェクトで共有され、非静的変数の場合はコピーが作成される以外に違いはありますか?

4

5 に答える 5

10

宣言時に変数を初期化しても、実質的な違いはありません。

変数がコンストラクターで初期化されると、大きな違いが生じます。

以下の例を参照してください。

/** 
 *  If you do this, it will make almost no 
 *  difference whether someInt is static or 
 *  not.
 *
 *  This is because the value of someInt is
 *  set immediately (not in a constructor).
 */

class Foo {
    private final int someInt = 4;
}


/**
 *  If you initialize someInt in a constructor,
 *  it makes a big difference.  
 *
 *  Every instance of Foo can now have its own 
 *  value for someInt. This value can only be
 *  set from a constructor.  This would not be 
 *  possible if someInt is static.
 */

class Foo {
    private final int someInt;

    public Foo() {
        someInt = 0;
    }

    public Foo(int n) {
        someInt = n;
    }

}
于 2012-11-20T02:11:35.930 に答える
2

静的変数は、そのクラス定義の外にあるドット区切りを介してアクセスできます。したがって、myClass というクラスがあり、その中に static int x = 5; があるとします。その後、myClass.x で参照できます。

final キーワードは、定義後に x の値を変更できないことを意味します。そうしようとすると、コンパイラはエラーで停止します。

于 2012-11-20T02:12:07.427 に答える
0

static 修飾子は明示的な必要性がある場合にのみ使用し、 final は定数のみに使用する必要があることを指摘します。

于 2012-11-20T02:33:33.350 に答える
0

変数として、static値にアクセスするためにクラスのインスタンスは必要ありません。その他の唯一の違いは、staticフィールドがシリアル化されないことです (クラスがシリアル化可能な場合)。また、コンパイルされたコード内のすべての参照が最適化されて除去される可能性もあります。

于 2012-11-20T02:11:50.580 に答える
0

sのみを使用している場合、違いは現れませんint。ただし、それがどのように異なるかの例として:

class PrintsSomething {
   PrintsSomething(String msg) {
       System.out.println(msg);
   }
}

class Foo {
    public static final PrintsSomething myStaticObject = new PrintsSomething("this is static");
    public final PrintsSomething myLocalObject = new PrintsSomething("this is not");
}

これを実行すると:

new Foo();
new Foo();

...出力は次のとおりです。

this is static
this is not
this is not
于 2012-11-20T02:25:07.197 に答える