2016-07-01 8 views
1

mein Code wie folgt aus:Warum müssen wir statische Variable als final in der inneren Klasse deklarieren?

public class BookStore { 
      class Enumerator1 { 
       static int b = 0;//requires final 
      } 

     public String searchBook(final String criteria) { 
      class Enumerator2 { 
       static int b = 0;//requires final 
      } 
      return ""; 
     } 
    } 

hier ib als statisch nicht erklären kann es erfordert, warum nicht verstehen constant.I sein könnte?

+1

Hier ist [der relevante JLS-Abschnitt] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3) - "Innere Klassen können nicht deklarieren statische Mitglieder, außer sie sind konstante Variablen " – resueman

+0

Siehe auch http://StackOverflow.com/questions/18526099/error-field-name-cannot-be-declared-static – Raedwald

Antwort

2

Da die Klasse selbst nicht statisch ist, würde eine nicht statische statische Deklaration eine Instanz pro Elterninstanz bedeuten, die nicht möglich ist. "final" ist im Grunde eine Konstante, so dass es keine Probleme verursacht.

Wenn Sie die innere Klasse statische als auch deklarieren, können Sie statische Variablen haben innen:

public class BookStore { 
     static class Enumerator1 { 
      static int b = 0;// works 
     } 

    public String searchBook(final String criteria) { 
     class Enumerator2 { 
      final static int b = 0; // still necessary as the class can't be static here 
     } 
     return ""; 
    } 
} 
1

Alle static Erklärungen für innere Klassen in der übergeordneten Klasse sein muss. Eine static final wird als Konstante behandelt und benötigt daher keinen echten statischen Raum, so dass Sie sie in inneren Zahlen verwenden können.

0

JLS besagt, dass "innere Klassen statische Elemente nicht deklarieren dürfen, außer sie sind konstante Variablen". Der Grund für dieses Verbot besteht darin, dass eine Klassenvariable in einer objektabhängigen Klasse ein hohes Potenzial zur Erzeugung von Verwirrung aufweist.

Betrachten wir ein einfaches Beispiel:

class Parent { 
    public class Child { 
     static int count = 1; // Let's pretend that it is possible 
     public void increment() { 
      count++; 
     } 
     public void show() { 
      System.out.println(count); 
     } 
    } 
    public Child generateChild() { 
     return new Child(); 
    } 
} 

die wir nun sagen, dass wir dies tun:

Parent p1 = new Parent(); 
Parent.Child c1 = p1.generateChild(); 
Parent p2 = new Parent(); 
Parent.Child c2 = p2.generateChild(); 
c2.show(); 
c1.increment(); 
c2.show(); 

Ein Zuwachs auf ein Kind von Eltern 1 bewirkt eine Änderung bei einem Kind von einem anderen Elternteil, auch obwohl eine Child Klasse an seine Parent Klasse angeschlossen ist, sollten Kinder verschiedener Eltern unabhängige Kontexte haben.

Java-Sprachdesigner argumentierten, dass, wenn Sie dieses Verhalten wirklich wollen, Sie die statische Variable problemlos in die Elternklasse einfügen könnten.

Verwandte Themen