静态变量与局部变量
- 参数表分配完毕后,再根据方法体内定义的变量的顺序和作用域分配。
- 类变量有2次初始化机会,第1次是“准备阶段”,执行系统初始化,对类变量设置零值;还有1次是“初始化”阶段,赋予程序源在代码中定义的初始值。局部变量和类变量初始化不同的是,局部变量表不存在系统初始化过程,即一旦定义了局部变量必须要进行人为的初始化,否则将无法使用。
- 局部变量在使用前,必须要经过显示赋值,否则编译通不过。在栈帧中,与性能调优最密切的就是局部变量表。在方法执行时,虚拟机使用局部变量表完成方法的传递。
- 局部变量表中的变量也是重要的垃圾回收根节点,只要被局部变量表中直接或间接引用的对象都不会被回收。
例如下面的代码是错的,没有赋值不能使用。
public void test1( ){
int m;
system.out.println(m);
}
变量的分类:
- 按照数据类型分为基本数据类型、引用数据类型
- 按照在类中声明的位置分为:成员变量、局部变量,其中成员变量分为类变量和实例变量。成员变量在使用前都经历过默认的初始化赋值,类变量在链接中的准备阶段会给类变量默认赋值,到初始化阶段的时候会给类变量显式赋值即静态代码块赋值;实例变量是随着对象的创建会在堆空间中分配实例变量空间,并进行默认赋值。
方法中定义的局部变量是否线程安全?
当只有一个线程可以操作此数据,则必然是线程安全的;当有多个线程操作此数据,则此数据是共享数据,如果不考虑同步机制,会存在线程安全的问题。
欢迎批评指正,提出问题,谢谢!