2012-04-05 21 views
12

Aşağıdaki kod yasal ileri başvuran vaka mı başvurulması? eğer evet neden?Java Yasal İleri

public class MyClass 
{ 
    private static int x = getValue(); 
    private static int y = 5; 
    private static int getValue() 
    { 
    return y; 
    } 
    public static void main(String[] args) 
    { 
    System.out.println(x); 
    } 
} 

cevap

19

sahip Yukarıdaki kod tamamen yasal bir Java olduğunu. İlk, tüm alanları türlerine (0, false veya null) için varsayılan olarak ayarlanır ve daha sonra, beyan sırayla başlatılır şu şekildedir: Java'da, statik alanlar başlatılır. Bu, yukarıda kod aşağıdakileri yapmak için garanti olduğu anlamına gelir:

  1. Set x ve sıfıra y, o int s için varsayılan değer olduğundan. y değerini okur getValue(), arayarak
  2. Başlatma x. y henüz başlatılmamış için, yine de bu x 0 değerini alır ve y değeri 5. Bu davranış olan alacak demektir y

5. değeri 0

  • başlatma var taşınabilir ve garantili. You can see this here.

    Bu yardımcı olur umarız!

    Sen buna derler gerçeğiyle yasal olup olmadığını söyleyebilir
  • +0

    Ne o Statik değişkenler ve yöntem olmadığı durumlarda olurdu? – Vibhor

    +2

    Davranışın aynı olduğuna inanıyorum - başlatma ilk önce her şeyi varsayılan değere ayarlar, sonra her birini belirtilen değerle başlatır, sonra kurucuyu çağırır. – templatetypedef

    +1

    Hangi, btw, bir kurucudan kesin olmayan (veya özel) bir yöntemi asla çağırmamanız için bir nedendir; Birisi, bu yöntemi geçersiz kılmak ve henüz başlatılmamış bir final alanını görmek için bile henüz yapılmayan bir '' bu '' görmek için çok kolay. – yshavit

    5

    ; Diğer bazı dillerin aksine, Java "tanımlanmamış davranış" kavramına sahip değildir. Burada olan şey tamamen belirsizdir. Bu sezgisel olabilir, ama özellikle yasal: Başka bir statik değişken başlatılırken denilen bir yöntemden başlatılmadan önce statik bir değişken erişebilirsiniz. x 'in başlatıcı şirketinden y erişmenin yüzeysel olarak benzer durumda - diğer bir deyişle,

    private static int x = y; 
    private static int y = 5; 
    

    özellikle izin verilmez. Gerçekten neden güçlü bir sebep yok - sadece nasıl olduğu.

    +0

    Değişkenler statik değilse ne olur? Bu durumda da davranış aynı mıdır? – Vibhor

    +0

    Evet, etkili bir şekilde aynı. Statikler için listelenen kurallar çok az farklıdır çünkü bir sınıf için gerçek "yapıcılar" yoktur, ancak nesneler esas olarak aynı şekilde başlatılır. Örneğin değişkenler, başlangıç ​​düzenleyiciler ve örnek blokları, her kurucuya, görünüm sırasına göre hazırlanır. Statikler, başlatıcılar ve statik bloklar, sırayla, () 'adlı tek bir yöntemle derlenmiştir. –

    +0

    Bir derleyici ile test edilebilecek bir programa sahip olmak, korkarım ki bu gibi sorular söz konusu olduğunda bir lüks.Bu OCJP sınavı için bir sahte sınavdan alınmıştır. Şimdi öğreniyorum ve sınavın amacı için alay konusu yapan bu tamamen aptalca olan bu aptal sorular. –