一般に、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
値を持ちますが、常に同じ値です(不変であり、リテラルで初期化されます)。これは、final static
すべてのインスタンスに対して変数を1つだけ持つことと同じです。
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
。