java的静态方法中不能有静态变量?

public static void f() {
static int i = 5;//line 1
}
line 1编译错误:Illegal modifier for parameter i; only final is permitted
为何如此?
我想知道为什么方法的局部变量不能加static修饰,至于这样不允许我是知道的

在方法内部定义的叫“局部变量”,而不是静态变量,局部变量不能加static,包括protected, private, public这些也不能加。静态变量是定义在类中,方法体外面的。

如果你清楚JVM,应该知道局部变量是保存在栈中的,而静态变量保存于方法区,局部变量出了方法就被栈回收了,而静态变量不会,所以在局部变量前不能加static关键字。追问

嗯 有道理 看来得把那个《Deep Into JVM》翻一遍了

追答

嗯,常用的就是栈、堆、方法区这三个,理解了以后对引用变量的认识也会有所提高。

追问

我认为还可以换个角度理解,静态变量和常量是编译时确定的,而方法的局部变量是运行时确定的。所以可以得出方法的局部变量不能加static修饰。

追答

对的,这个确定是指位置是确定的,静态变量不加final的话,其值还是有可能被改的。局部变量每调用一次方法其值都在当前线程的当前栈中临时分配,也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了。

追问

所以一般编译时确定的静态变量或常量都保存在方法区中,而运行时确定的局部变量保存在栈中。
“局部变量每调用一次方法其值都在当前线程的当前栈中临时分配,也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了。" 所以多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。

追答

哈哈,当然,局部变量不可能被其他线程访问到,栈是线程私有的。
方法区、堆中的变量必须考虑线程安全问题,因为可能被多个线程使用。兄弟的JVM理解比我好。

追问

没有 正因为对JVM的理解都很零乱,所以才想系统学习下,所谓万剑归宗嘛,O(∩_∩)O~。远没达那个程度

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-13
静态即:一个数据成员或方法属于它所在的类,而不象一般数据成员或方法,只属于它所在的对象,对象不同,数据成员的值也不同。 静态方法里的变量是临时变量,只在静态方法里有效。而声明STATIC表示该变量属于类。静态变量相当于C语言的全局变量.既然加了static的变量是类一级数据成员,有什么理由放在一个方法里面。方法里面的应该是局部的只有本方法才会用的,在方法里面声明一个类一级的数据成员有何意义呢? 所以JAVA不允许这样做。 要提醒一下,一般的方法同样不能声明静态数据成员。
第2个回答  2011-12-13
Java 在方法的内部是不能够定义静态变量的,可以将它定义为类变量。
public class Test{
static int i = 5; //将i 定义为类 的静态变量。
public static void f() {
//static int i = 5;//line 1
}
}
第3个回答  2011-12-13
static修饰的是类变量也就是静态变量,作用域是整个类中。 而方法中定义的变量是局部变量,作用域只在于这个方法中。 如果用static修饰的话不就矛盾了,所以方法中定义的变量不允许用static修饰追问

你的回答和 dftten差不多,也能解释得过去

第4个回答  2011-12-13
在Java 中方法中都不能有 static 修饰的变量
C/C++中可以
相似回答