2016-07-01 3 views
1

私のコードは次のようである:ここ内部変数のstatic変数をfinalとして宣言する必要があるのはなぜですか?

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 ""; 
     } 
    } 

私はそれがconstant.Iはなぜ理解できないことを要求する静的としてBを宣言することはできませんか?

+1

[関連するJLSセクション](https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.3) - 「インナークラスでは宣言できません静的メンバー(定数変数でない限り) " – resueman

+0

参照http://stackoverflow.com/questions/18526099/error-field-name-cannot-be-declared-static – Raedwald

答えて

2

クラス自体は実際には静的ではないので、最終的な静的宣言では、親インスタンスごとに1つのインスタンスが存在しないことを意味します。 "final"は基本的には定数なので問題はありません。あなたにも、静的な内部クラスを宣言すると

、あなたは内部の静的変数を持つことができます:内部クラス用

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

すべてstatic宣言は、親クラスである必要があります。 static finalは定数として扱われるため、実際には実際の静的なスペースは使用されないため、内部カルスで使用することができます。

0

JLSでは、「インナークラスは定数変数でない限り、静的メンバーを宣言できません」と記載されています。この禁止の背景にあるのは、オブジェクト依存クラスのクラス変数が混乱を招く可能性が高いためです。

単純な例を考えてみましょう:それでは、私たちはこれを行うとしましょう

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(); 
    } 
} 

を:

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

親1の子の増加であっても、別の親の子に変化が生じますChildクラスがそのParentクラスに添付されていますが、異なる親の子は独立したコンテキストを持つ必要があります。

Java言語の設計者は、この動作が本当に必要な場合は、静的変数を親クラスに入れることに問題はないと推論しました。

関連する問題