Java中的成员变量、局部变量初始化的问题

【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进行初始话开销较大;
    从业务上讲,局部变量一般用于实际问题下的运算,很少会用到默认值,赋值意义不大;
    从编程思想上讲,局部变量不初始化,而是报错提醒,更有助于程序员减少开发过程中出现缺陷的可能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值