SORU
15 HAZİRAN 2015, PAZARTESİ


Neden iki program üçüncü etmese de ileri başvuran hataları var mı?

Aşağıdaki, bir vererek derleme değil 'yasadışı ileriye başvuru' iletisi:

class StaticInitialisation {

    static
    {
        System.out.println("Test string is: "   testString);
    }

    private static String testString;

    public static void main(String args[]) {
        new StaticInitialisation();
    }
}

Ancak, aşağıdaki derleme:

class InstanceInitialisation1 {

    {
        System.out.println("Test string is: "   this.testString);
    }

    private String testString;

    public static void main(String args[]) {
        new InstanceInitialisation1();
    }
}

Ama sonrasında, bir vererek derleme değil 'yasadışı ileriye başvuru' iletisi:

class InstanceInitialisation2 {

        private String testString1;

    {
        testString1 = testString2;
    }

    private String testString2;

    public static void main(String args[]) {
        new InstanceInitialisation2();
    }
}

Neden Staticİnitialisation ve İnstanceİnitialisation2 İnstanceİnitialisation1 yok iken derleme, değil mi?

CEVAP
15 HAZİRAN 2015, PAZARTESİ


Bu İDEA Bölüm 8.3.3 ile kaplıdır:

Ortaya çıkan sınıf değişkenleri kullanımı sözel olarak kullanımından sonra bu sınıf değişkenleri kapsam içinde (madde 6.3) olmasına rağmen bazen sınırlı kalıyor. Özellikle, aşağıdakilerin tümü doğruysa, bir derleme zamanı hatası:

  • Sınıf veya arayüz olarak C sınıfı bir değişken bildirimi bir sınıf değişkeni bir kullanımdan sonra sözel olarak görünür;

  • Kullanımı da C sınıfı bir değişken başlatıcı veya C statik başlatıcı basit bir isim

  • Kullanım sol taraftan atamanın tarafı değildir

  • C en içteki sınıf veya arabirim kullanımı çevreleyen.

Ortaya çıkan örnek değişkenleri kullanımı sözel olarak kullanımından sonra bu örnek değişkenleri kapsam içinde olmasına rağmen bazen sınırlı kalıyor. Özellikle, aşağıdakilerin tümü doğruysa, bir derleme zamanı hatası:

  • Sınıf veya arabirim C örnek değişkeni ilanı örnek değişkeni bir kullanımdan sonra sözel olarak görünür;

  • Kullanımı da C örnek değişken bir başlatıcı ya da C örnek başlatıcı basit bir isim

  • Kullanım sol taraftan atamanın tarafı değildir

  • C en içteki sınıf veya arabirim kullanımı çevreleyen.

İkinci durumda, kullanındeğilbasit bir ad - açıkça this var. Hata yok yani ikinci liste yukarıda alıntılanan ikinci kurşun ile uyumlu olmadığı anlamına gelir.

Eğer bunu değiştirirseniz:

System.out.println("Test string is: "   testString);

... sonra derleme değil.

Ya da ters yönde, statik başlatıcı blok kodu değiştirebilirsiniz:

System.out.println("Test string is: "   StaticInitialisation.testString);

Garip, ama bu işler böyle.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jonathan Morrison

    Jonathan Mor

    24 Mart 2010
  • macpulenta

    macpulenta

    9 EYLÜL 2006
  • Mark Brown

    Mark Brown

    9 HAZİRAN 2010