public static void f() {
static int i = 5;//line 1
}
line 1编译错误:Illegal modifier for parameter i; only final is permitted
为何如此?
我想知道为什么方法的局部变量不能加static修饰,至于这样不允许我是知道的
嗯 有道理 看来得把那个《Deep Into JVM》翻一遍了
追答嗯,常用的就是栈、堆、方法区这三个,理解了以后对引用变量的认识也会有所提高。
追问我认为还可以换个角度理解,静态变量和常量是编译时确定的,而方法的局部变量是运行时确定的。所以可以得出方法的局部变量不能加static修饰。
追答对的,这个确定是指位置是确定的,静态变量不加final的话,其值还是有可能被改的。局部变量每调用一次方法其值都在当前线程的当前栈中临时分配,也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了。
追问所以一般编译时确定的静态变量或常量都保存在方法区中,而运行时确定的局部变量保存在栈中。
“局部变量每调用一次方法其值都在当前线程的当前栈中临时分配,也就是说对程序,同一时刻,只可能有一块栈内存被当前方法使用,用完了就回收了。" 所以多线程并发访问一个只用到局部变量的方法是不用考虑并发安全性的。
哈哈,当然,局部变量不可能被其他线程访问到,栈是线程私有的。
方法区、堆中的变量必须考虑线程安全问题,因为可能被多个线程使用。兄弟的JVM理解比我好。
没有 正因为对JVM的理解都很零乱,所以才想系统学习下,所谓万剑归宗嘛,O(∩_∩)O~。远没达那个程度
你的回答和 dftten差不多,也能解释得过去