Java中类变量,实例变量,局部变量的赋值
在 Java 中,类变量,实例变量可以不经过主动赋值就直接使⽤,⽽局部变量在不主动赋值的情况下,是⽆法使⽤的。在下⾯分析⼀下这个原因:
1. 类变量
类变量的赋值有两次,两次都在类加载的过程中,类加载可以简单的分为加载,连接,初始化,其中连接⼜分为验证,准备,解析。
第⼀次赋值在准备阶段:为类的静态变量分配内存,并将其初始化为默认值
第⼆次赋值在初始化阶段:也就是执⾏ clint,就是⾃⼰的静态变量赋值和静态初始化块
所以,即使没有为类变量赋值,也会在准备阶段赋默认值
2. 实例变量java配置用户变量
在使⽤ new 创建实例的时候,在字节码的层次起码会有new,invokespecial这两条字节码语句,其中在new字节码执⾏的时候,会创建实例,并将其实例变量(包括本类及其全部⽗类所定义的每个实例变量)初始化为各⾃的默认值
接着在执⾏invokespecial时,会执⾏ lint,也就是其中⼀个构造⽅法
可见在实例变量的赋值过程中,也会有两次赋值,所以即使没有主动赋值,也已经有了默认值了
3. 局部变量
但是在局部变量中,局部变量是存储在局部变量表中的(引⽤和基本类型,引⽤所指向的对象还是在堆中的);⽽局部变量表是属于栈帧的⼀部分,虚拟机完全没有给这⾥赋初值,所以不赋初值是⽆法使⽤的
总结
通过上⾯的描述,可以知道,类变量和实例变更都存在⼀次⾃动的赋默认值的情况,所以类变量,实例变量可以不经过主动赋值就直接使⽤,⽽局部变量在不主动赋值的情况下,是⽆法使⽤的