Java では、次の違いは何ですか?
private final static int NUMBER = 10;
そして
private final int NUMBER = 10;
どちらも と ですprivate
がfinal
、違いはstatic
属性です。
何が良いのでしょうか? また、その理由は?
ベストアンサー1
一般的には、 「型のインスタンスではなく、型static
自体に関連付けられている」ことを意味します。
つまり、その型のインスタンスを作成しなくても静的変数を参照でき、その変数を参照するすべてのコードはまったく同じデータを参照することになります。これをインスタンス変数と比較すると、その場合、クラスのインスタンスごとに変数の独立したバージョンが 1 つあります。たとえば、次のようになります。
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
10 を出力します:y.instanceVariable
と は異なるオブジェクトを参照するx.instanceVariable
ため、別々です。x
y
参照を介して静的メンバーを参照することはできますが、そうするのはよくありません。次のようにすると:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
すると、20 が出力されます。変数は 1 つだけで、インスタンスごとに 1 つではありません。次のように記述した方がわかりやすいでしょう。
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
これにより、動作がはるかに明確になります。最新の IDE では通常、2 番目のリストを 3 番目のリストに変更することを提案します。
各インスタンスは独自の値を持ちますが、常に同じ値(不変でリテラルで初期化される)を持つため、次のように値を初期化するインライン宣言を使用する理由はありません。これは、すべてのインスタンスに対してNUMBER
1 つの変数のみを持つことと同じです。final static
private final int NUMBER = 10;
したがって、変更できない場合は、インスタンスごとに 1 つのコピーを持つことは意味がありません。
ただし、次のようにコンストラクターで初期化する場合は意味があります。
// No initialization when is declared
private final int number;
public MyClass(int n) {
// The variable can be assigned in the constructor, but then
// not modified later.
number = n;
}
ここで、 の各インスタンスに対してMyClass
、 の異なるが不変の値を持つことができますnumber
。