为什么我们必须在内部类中将静态变量声明为final?

时间:2016-07-01 13:16:20

标签: java

我的代码是这样的:

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

在这里,我不能将b声明为静态,它需要保持不变。我无法理解为什么?

3 个答案:

答案 0 :(得分:2)

因为类本身实际上不是静态的,所以非最终静态声明意味着每个父实例有一个实例是不可能的。 "最终"基本上是一个常数,所以它不会引起任何问题。

如果您也将内部类声明为静态,则可以在其中包含静态变量:

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 :(得分:1)

内部类的所有static声明必须在父类中。 static final被视为常量,因此实际上不占用真正的静态空间,因此您可以在内部calsses中使用它们。

答案 2 :(得分:1)

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语言设计者推断如果你确实想要这种行为,那么将静态变量放在父类中就没有问题了。