Ne staticmodifiye 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 num1değişken ve sadece bir num2değ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.num1ve 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.num1A.num2num1num2
Ö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.objolduğu nullve A.num1/ A.num2sıfırdır.
İlk bildirimi ( A.obj) bir örneğini oluşturur A()ve kurucusunu Aartışlarla A.num1ve A.num2. Bildirim tamamlandığında A.num1ve A.num2her ikisi de 1olduğunda ve A.objyeni oluşturulan Aörneğe başvurduğunda.
İkinci bildirimin ( A.num1) başlatıcısı yoktur, dolayısıyla A.num1değ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 1ve 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.