2013-03-15 25 views
9

Arkadaşlarımdan biri, hangisinin ilk statik değişken veya statik bloğu yükleyeceğini sordu.İlk statik değişken veya statik blok yüklenecek?

Yanıtım statik değişkene işaret ediyor.

yüzden bana iki denklemler verdi ve aralarında
İlk Denklem

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
} 

O/P ayırt etmek söyledi: 0 90

İkinci Denklem

public class Some { 
    public static void main(String args[]) 
    { 
     System.out.println(Some.x); 
    } 
    static int x=90; 
    static { 
     System.out.println(Some.x); 
    } 
} 

O/P: 90 90

Bayt kodunu derlemeye çalıştım ve yukarıdaki denklem için de aynı olduğunu buldum. Lütfen aralarında ayrım yapmama yardım edin. Statik değişken başlatıldığında kafam karıştı.

+3

Statik nesneler, sırayla, sınıfta tanımlandığı sırayla yürütülür. –

+0

Bayt kodunun aynı olduğundan emin misiniz? Deklarasyonların farklı bir sırayla ortaya çıkmasını beklerdim ve @Sudhanshu'nun belirttiği gibi deklarasyon kararı önemlidir. –

+0

@PatriciaShanahan ya denklem bayt kodu için aynıdır. – Hablu

cevap

1

statik değişkenler ve statik blok göründükleri sırayla yürütülür: zaten yığın taşması üzerine buna ilişkin birkaç soru vardır ... Bu senin için iyi bir cevabı vardır.

Burada ilk O/P: 0 JVM Class yüklendiğinde static int x=90;

+0

Çöp. Sabit katlama, derleyici tarafından değil, JVM tarafından yapılır. JVM, statik değişken başlatıcıları ve kaynak dosyada göründükleri metin düzeninde bloklar yürütür. Önce değişkenler değil, sonra bloklar. – EJP

+0

Düzenlendi, rahatsızlık ve teşekkür için özür dilerim. –

-1

statik değişkenler yürütülür statik değişken başlatma ifadesinden sonra yürütülür statik bloğun System.out.println(Some.x); tablosunda olduğu gibi, 90 ve sınıf yüklenen ne zaman başlatılmış veya statik yöntemi çağrıldığında.

statik Başlatma Sıvısı, Sınıf başlatılmadan önce veya statik yöntemi çağrılmadan önce ve Statik değişkeni kullanılmadan önce de Sıfırlanır. Ben statik ve örneğinin kontrol akışı için basit bir örnek veriyorum

-1

maddeleri:

size 2 clases A ve B sınıf A sınıfı B'ye uzanır ve B sınıfı bir ana yöntem vardır varsayalım.cmd hem komutadan başarılı Derleme sonra gibidir:

Şimdi adım adım bakınız ne olacağını
java B 

:

  • sınıfları A ve B yüklenecektir
    1. statik üyeleri ve sınıf blokları Bir tanımlanacak ve sırayla (
    2. statik elemanlar ve B blokları tanımlanacak ve yürütülecek (birer birer) ardışık olarak yürütülecektir (tek tek) sınıfta yükleme)
    3. B sınıfı ana yöntem çağrılır (B sınıfının ana yöntemine sahip olmaması durumunda, A sınıfı ana yöntem çağrılır)
    4. Sınıf A nesnesini oluşturacağınız anda: tümü örneğin üye başlatma ve örnek blok yürütme sınıfta yapılacaktır bir
    5. sınıf B'nin bir nesne oluşturmak ise
    6. yürütülecek (eğer nesne oluşturmak için kullanılır) A sınıfı yapıcı: her örnek üye başlatma ve örnek blok yürütme işlemi A sınıfı olacaktır.
    7. sonra tüm örnek üye başlatma ve örnek blok yürütme sınıf B

      yapılacaktır yürütülecek olacak sınıfı A (varsayılan kurucu veya B'nin kurucusundan denir eğer herhangi diğer) yapıcısı
    8. ve (nesneyi oluşturmak için kullanılır) B sınıfı yapıcı yürütülür bu

    Not sonra muayene: statik üyeleri ve bloklar yürütme sınıfın bir nesnesini oluştururken örnek üyeleri ve örnek blokları her defasında yürütüldüğünde, ilk kez sınıf yüklenirken sadece bir kez yapılır. Lütfen doğru olmazsam haber verin.

  • +0

    'Sınıf A'ya uzanan A sınıfı, en iyi ihtimalle belirsiz veya en kötüsü anlamsızdır. A'nın B'yi uzattığını düşünüyorsanız, cevabınızın çoğu yanlıştır. – EJP

    +0

    Sizi alamadım, lütfen noktanızı açıklayın. –

    +0

    Yapabileceğimi sanmıyorum. Bana zaten gayet açık görünüyor. Aldığım bildirimi açıklığa kavuşturmalısın. – EJP

    İlgili konular