【1】成员变量
-
成员变量有默认初始值,而方法内的局部变量却没有初始值。这个问题涉及到JVM 类加载和字节码执行两个阶段,这两个阶段是依次执行的。JVM类加载是JVM利用类加载器将class文件加载到JVM的过程,涉及“加载”、“验证”、“准备“、“解析“和”初始化“。
-
类的成员变量初始化 --在JVM类加载阶段完成
类的成员变量又分为静态成员变量和非静态成员变量。
1、静态成员变量:静态成员变量会被初始化两次,第一次在“准备”阶段,先进行一次初始化,系统附上默认值;第二次在“初始化”阶段,根据代码中的赋值情况再进行一次初始化。
【例】
public static int i =3 ;
第一次初始化后i的值为0,第二次初始化后,值才为3.
数据最终存放在方法区中。
非静态成员变量
仅“初始化”阶段赋值。根据代码中的赋值情况,代码不赋值直接赋默认值,有赋值则等于代码中的赋值。对象实例化后,该变量随java对象分配到java堆中。
【2】局部变量 -
对于局部变量要求程序员自己主动赋值
局部变量存在于线程的Stack中,虽然Stack可以帮助我们进行初始化,但是没必要
【注】为什么局部变量要手动初始化 -
套用《Thinking in Java》作者Bruce Eckel的话 :编译器当然可以为局部变量附一个默认值,但是未初始化的局部变量更有可能是程序员的疏忽,所以采用默认值范围会掩盖这种失误。因此强制程序员提供一个初始值,往往能够帮助找出程序里的缺陷。
-
总结一下,为什么局部变量需要手动初始化?
从技术上来讲,局部变量一般来说总量大,生命周期短,JVM进行初始话开销较大;
从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;
从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能。