我的代码是这样的:
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声明为静态,它需要保持不变。我无法理解为什么?
答案 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语言设计者推断如果你确实想要这种行为,那么将静态变量放在父类中就没有问题了。