2017-09-21 1 views
1

Per JLS:Innere Klasse erlaubt statische Felder und nicht konstante statische Ausdrücke - Warum?

Eine innere Klasse ist eine verschachtelte Klasse, die nicht explizit oder implizit erklärt statisch ist. Innere Klassen können keine statischen Initialisierer oder Mitgliederschnittstellen deklarieren.

Aber mein folgender Code kompiliert erfolgreich.

class A { 
    interface B { 
     class C { // Inner class having static variables. 
      static int d; // Static variable 
      static { 
      } 
     } 
    } 
} 

Kann jemand mir dieses Verhalten

+2

Ich bin mir ziemlich sicher, 'C' ist implizit' static', im Gegensatz zu einer inneren Klasse. –

+0

Ihre geschachtelte Klasse ** ist ** implizit als statisch deklariert. Weil Schnittstellen keine inneren Klassen haben können. Das Gleiche gilt für die Schnittstelle B, die implizit statisch ist. –

Antwort

4

Gefunden JLS Spezifikationen für das gleiche.

8.5.2 - "Member-Schnittstellen immer implizit statisch sind"

9.5 - „Schnittstellen Erklärungen Elementtyp enthalten (§8.5) Ein Mitglied Typ Erklärung in einer Schnittstelle ist implizit statische und public“

Dies bedeutet obigen Code ist moralisch äquivalent zu (implizite Modifikatoren in Großbuchstaben geschrieben werden):

class A { 
    STATIC interface B { 
     PUBLIC STATIC class C { //It's a static class - that's why static members are legal (like a toplevel class but nested) 
      static int d; //Static variable 
      static {} //Static initializer 

     } 
    } 
} 
2

Nested-Schnittstellen sind implizit statisch helfen zu verstehen und stellen keine nicht-statischen Kontext selbst haben, ist das, warum C implizit statisch ist.

1

Sie können eine Klasse innerhalb einer Schnittstelle definieren. Innerhalb der Schnittstelle ist die innere Klasse implizit öffentlich statisch. ... Schnittstellen können Membertyp-Deklarationen enthalten Eine Membertyp-Deklaration in einer Schnittstelle ist implizit statisch und public.

so können wir nicht nicht-statische Mitglieder in einen statischen Block, statische Methode oder statische Klasse erklären.

Verwandte Themen