实例变量在什么时候会被赋默认值例如int赋0, boolea赋false。
public class test{
public int a = 10;
......
}
我希望从JVM的角度出发,有相应的证明或者资料证明吗?
实例变量在什么时候会被赋默认值例如int赋0, boolea赋false。
public class test{
public int a = 10;
......
}
我希望从JVM的角度出发,有相应的证明或者资料证明吗?
类加载阶段的准备阶段
int
会被初始化为0,boolean
会被初始化为false
,float
会被初始化为0.0f等;对于引用类型,则会被初始化为null
。test
类为例,在类加载的准备阶段,a
这个实例变量已经在内存中有了空间,并且被初始化为0。对象实例化阶段(初始化之后)
public int a = 10;
),这个时候会将显式赋值覆盖掉之前的默认值。<init>
)中,会有指令将10赋值给a
。这个过程是在对象真正被创建并初始化的时候发生的。javap -c
命令来反编译test
类的字节码文件,可以看到在<init>
方法中有类似aload_0
(将this
引用压入操作数栈)、bipush 10
(将常量10压入操作数栈)和putfield
(将操作数栈顶的值存入实例变量a
)这样的字节码指令,这些指令表明了在对象初始化过程中对a
的赋值操作。在JVM规范中,详细规定了类加载和对象初始化的过程,这些规则保证了实例变量默认值的正确赋值时机。具体可以参考《Java虚拟机规范(Java SE 8版)》,其中对于类加载过程中的准备阶段和对象初始化阶段都有精确的定义和描述,这是理解变量赋值时机的权威资料。
15 回答7.1k 阅读
2 回答3.4k 阅读✓ 已解决
3 回答7.1k 阅读✓ 已解决
5 回答4.8k 阅读
3 回答5.2k 阅读
4 回答2.4k 阅读
2 回答2.3k 阅读✓ 已解决
是在对象创建过程中初始化并完成赋值的(目录:自动内存管理 -> HotSpot虚拟机对象探秘 -> 对象的创建)
详细可参看周志明老师的JVM这本书,这里给你截个图