2015-09-22 24 views
6

Neden java, statik olmayan bir iç sınıftaki statik başlatma bloğu ile statik bildirimlere izin vermiyor? Aşağıdaki kodda,Neden bir iç sınıftaki statik değişken için başlatıcı bloğu kullanamazsınız?

, dış2 çalışacak ve iç 2 aynı şeyi yapmasına rağmen olmaz. herhangi bir fikir? Bir geçici çözüm aramıyorum, sadece java'nın bunu neden başaramadığını anlamaya çalışıyorum.

public class WhyUNoStatic { 
    public static final String outer1 = "snth"; // ok 
    public static final String outer2; // ok 
    static 
    { 
     outer2 = "snth"; 
    } 

    public class Inner { 
     public static final String inner1 = "snth"; // still ok! 
     public static final String inner2; // FAILURE TIME 
     static 
     { 
      inner2 = "snth"; 
     } 
    } 
} 

düzenleme: inner1 iyi çalışır unutmayın. java'nın iç sınıflarda statik varlıkları yasakladığı değil, sadece açıklamalarını yasaklıyor.

+2

Çünkü sınıf ve' ilan edebilir statik {} 'statik üyesidir. Olabilir? –

+0

Java, iç sınıflarda sabit olmayan değişkenleri yasaklar. 'iç1' sabit bir değişkendir. 'inner2' değil. –

cevap

2

JLS, Section 8.1.3, bu davranışa izin vermez.

Bir iç sınıf statik başlatıcıyı (§8.7) bildirirse, bir derleme zamanı hatasıdır.

Bir iç sınıf, üye sabit bir değişken olmadıkça (§4.12.4) açıkça veya zımni statik olan bir üyeyi bildirirse, derleme zamanı hatasıdır.

Sen ok iç sınıf, içinde static değişkenleri final ilan etmesine karşın statik başlatıcı orada yasaktır.

+0

Ve neden olduğu gibi, zaten oldukça karmaşık başlangıç ​​dizisi daha da karmaşık olurdu. – biziclop

+0

Evet, işte bu yüzden almaya çalışıyorum. derleyici bunu neden başaramaz? Derleyicinin bununla uğraşmasının neden zor olduğunu göstermek için bir kod örneği görmeyi çok isterim. – acushner

2

JLS Chapter 8

İç sınıfları (§8.7) ya da üye arayüzleri statik başlatıcıları beyan olmayabilir bakın veya derleme zamanı hatası oluşur.

Sen yuvalanmış iç sınıflar `static` olmayan nihai üye olamaz yerine

public static class Inner {...} 
İlgili konular