无法在静态方法中声明静态变量
class Foo { public Foo() { } } class Bar { static Foo foo = new Foo(); // This is legal... public static void main(String[] args) { static int a = 0; // ... But why this is not? } }
为什么我们不能在静态函数内声明静态变量?
您必须使静态final static
或删除static
。
在Java中,static意味着它是类的变量/方法,它属于整个类,但不属于某个特定对象。 这意味着static关键字只能在“类范围”中使用。
通常,在C中,您可以静态分配本地范围的变量。 不幸的是,这不是Java直接支持的。 但是您可以通过使用嵌套类来实现相同的效果。
例如,允许以下内容,但这是糟糕的工程,因为x的范围远大于它需要的范围。 此外,两个成员(x和getNextValue)之间存在非明显的依赖关系。
static int x = 42; public static int getNextValue() { return ++x; }
人们真的想做以下事情,但这不合法:
public static int getNextValue() { static int x = 42; // not legal :-( return ++x; }
但是你可以这样做,
public static class getNext { static int x = 42; public static int value() { return ++x; } }
以牺牲一些丑陋为代价是更好的工程。
其他人已经解释了如何在编码级别处理这个问题。 请允许我解释为什么方法中的静态没有意义的逻辑和哲学原因。 你必须问一个问题“你希望变量能持续多久?”。
- 普通成员变量只要它们所属的实例一直存在;
- 在方法退出之前在方法中声明的变量;
- 静态类变量持续为类的生命周期(即永远用于大多数目的)
那么你希望你的’方法中的静态’变量持续多久? 如果直到方法结束,那么你可以在没有静态的情况下使用它。 如果它是类的生命周期,那么您可以将它声明为静态成员变量。 还有哪些其他选择?
C ++允许方法中的静态,但它们最终表现得像静态类变量,但范围缩小。 即使在C ++中,它们也很少使用。 它们最终的存储方式与静态成员变量完全相同。 这种模式被广泛认为是危险和令人困惑的,因为它让一个方法“记住”从一次调用到另一次调用的局部变量的值 – 如果其他一些代码选择的话,这个值会被改变在两次调用之间执行该方法。
Java设计者认为,少量的好处不值得语言的额外复杂性。
将变量声明为final,而不是static。
静态意味着每个类有一个,而不是每个类的一个实例。 最后意味着它在创建后无法修改。 (虽然请注意,制作引用final不会使它引用的类不可变)。
换句话说,如果你有一个
final String[] array = new String[3];
您无法再更改该变量,例如,如果您想为其分配一个不同的大小的新arrays。 但是,您可以修改数组的内容。
array[0] = "test";
因为这会修改内容,而不是数组本身。
对于任何可变对象都是一样的。