Ne static
modifiye edici aracı bir değişken bildiriminde uygulanan değişken bir sınıf değişkeni yerine bir örneği değişken olmasıdır. Başka bir deyişle ... sadece bir num1
değişken ve sadece bir num2
değişken vardır.
(Bir kenara: statik değişken, isminin her yerde görünmemesi dışında, diğer bazı dillerde global bir değişken gibidir . A olarak bildirilmiş olsa bile public static
, nitelenmemiş isim yalnızca mevcut sınıfta veya bir üst sınıfta bildirilmişse görülebilir. veya statik bir içe aktarım kullanılarak içe aktarılmışsa. Fark budur. Gerçek bir global, hiçbir yerde nitelendirme olmadan görülebilir.)
Eğer başvurmak yüzden obj.num1
ve obj.num2
, aslında başvuruyorsunuz Asıl belirtme olan statik değişkenler ve . Ve benzer şekilde, kurucu arttığında ve , aynı değişkenleri (sırasıyla) artırıyor.A.num1
A.num2
num1
num2
Örneğinizdeki kafa karıştırıcı kırışıklık, sınıf ilklendirmesindedir. Bir sınıf, ilk olarak tüm statik değişkenlerin varsayılan olarak başlatılması ve ardından bildirilen statik başlatıcıların (ve statik başlatıcı bloklarının) sınıfta göründükleri sırayla çalıştırılmasıyla başlatılır. Bu durumda, şuna sahipsiniz:
static A obj = new A();
static int num1;
static int num2=0;
Şöyle olur:
Statikler, varsayılan başlangıç değerleriyle başlar; A.obj
olduğu null
ve A.num1
/ A.num2
sıfırdır.
İlk bildirimi ( A.obj
) bir örneğini oluşturur A()
ve kurucusunu A
artışlarla A.num1
ve A.num2
. Bildirim tamamlandığında A.num1
ve A.num2
her ikisi de 1
olduğunda ve A.obj
yeni oluşturulan A
örneğe başvurduğunda.
İkinci bildirimin ( A.num1
) başlatıcısı yoktur, dolayısıyla A.num1
değişmez.
Üçüncü bildirim ( A.num2
), sıfır atayan bir başlatıcıya sahiptir A.num2
.
Böylece, sınıfın ilklendirilmesinin sonunda, A.num1
öyle 1
ve A.num2
öyle 0
... ve baskı ifadelerinizin gösterdiği şey budur.
Bu kafa karıştırıcı davranış, statik başlatma tamamlanmadan önce bir örnek oluşturduğunuza ve kullanmakta olduğunuz kurucunun henüz başlatılmamış bir durağıya bağlı olup değiştirdiği gerçeğine bağlıdır . Bu, gerçek kodda yapmaktan kaçınmanız gereken bir şey.