Genel olarak, static
" bir örnek yerine türün kendisiyle ilişkilendirilmiş" anlamına gelir .
Bu, daha önce türden bir örnek oluşturmadan statik bir değişkene başvurabileceğiniz anlamına gelir ve değişkene başvuran herhangi bir kod, aynı verilere atıfta bulunur. Bunu bir örnek değişkeniyle karşılaştırın: bu durumda, sınıfın her örneği için değişkenin bağımsız bir sürümü vardır. Yani mesela:
Test x = new Test();
Test y = new Test();
x.instanceVariable = 10;
y.instanceVariable = 20;
System.out.println(x.instanceVariable);
10 çıktı alır: y.instanceVariable
ve x.instanceVariable
ayrıdır, çünkü x
vey
farklı nesneler bakın.
Sen olabilir bunu yapmak için kötü bir fikir olsa da, referanslar yoluyla statik üyelere bakın. Yapsaydık:
Test x = new Test();
Test y = new Test();
x.staticVariable = 10;
y.staticVariable = 20;
System.out.println(x.staticVariable);
bu 20 çıktısı alır - örnek başına bir tane değil, yalnızca bir değişken vardır. Bunu şu şekilde yazmak daha açık olurdu:
Test x = new Test();
Test y = new Test();
Test.staticVariable = 10;
Test.staticVariable = 20;
System.out.println(Test.staticVariable);
Bu davranışı çok daha belirgin hale getirir. Modern IDE'ler genellikle ikinci listenin üçüncü listeye değiştirilmesini önerecektir.
Aşağıdaki gibi değeri başlatan bir satır içi bildirime sahip olmak için hiçbir neden yoktur, çünkü her örnek kendi kendine sahip olur, NUMBER
ancak her zaman aynı değere sahiptir (değişmezdir ve değişmez bir değerle başlatılır). Bu, final static
tüm örnekler için yalnızca bir değişkene sahip olmakla aynıdır .
private final int NUMBER = 10;
Bu nedenle değiştirilemezse, örnek başına bir kopyaya sahip olmanın bir anlamı yoktur.
Ancak, böyle bir yapıcıda başlatılırsa mantıklıdır:
// 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;
}
Şimdi, her örneği MyClass
için farklı ama değişmez bir değere sahip olabiliriz number
.