我有一个问题:在java中我们声明int,long,double等,(原始数据)或非原始(对象数据),没有使用默认值初始化,但在运行时它将采用默认值.现在我的问题是哪一个分配默认值:java编译器或Java虚拟机(JVM)?
例如:
int x; System.out.println(x) //Result is 0;
T8Z.. 11
Java中有三种不同类型的声明变量.它们是实例,类和局部变量.
实例变量
实例变量是类的非静态字段,通常简称为字段.
原始数字字段初始化为0.这包括byte
,short
,int
,long
,float
和double
.
boolean
s初始化为false
.
char
s初始化为空字符\u0000
.
引用类型初始化为null
.
类变量
类变量是声明为static的类中的字段,通常称为静态变量或静态字段.它也与实例变量初始化相同.
局部变量
局部变量是方法中定义的变量,包括任何方法参数.必须在使用前初始化局部变量.它们没有默认值.
创建方法时,JVM将完成初始化过程.
字段的默认值由JVM在运行时分配.从JLS 15.9.4(强调我的):
新对象包含在指定类类型及其所有超类中声明的所有字段的新实例.在创建每个新字段实例时,会将其初始化为其默认值.
当然,鉴于这种行为在JLS中是标准化的,编译器可以想象利用它来基于未初始化字段以其默认值开始的假设来执行某些优化.
无论它们是什么类型(null
对于引用类型),字段都被初始化为等价的0 .本文给出了一个很好的列表:
Data Type: Default Value: boolean false char \u0000 int,short,byte / long 0 / 0L float / double 0.0f / 0.0d any reference type null
局部变量没有给出初始值,如果在使用之前未通过所有可能的代码路径为它们分配值,则使用它们是编译器错误.
请注意,在创建新数组时,数组元素也会自动初始化为默认值(例如,每个元素都new int[100]
将初始化为0).这适用于field和local数组变量.
Java中有三种不同类型的声明变量.它们是实例,类和局部变量.
实例变量
实例变量是类的非静态字段,通常简称为字段.
原始数字字段初始化为0.这包括byte
,short
,int
,long
,float
和double
.
boolean
s初始化为false
.
char
s初始化为空字符\u0000
.
引用类型初始化为null
.
类变量
类变量是声明为static的类中的字段,通常称为静态变量或静态字段.它也与实例变量初始化相同.
局部变量
局部变量是方法中定义的变量,包括任何方法参数.必须在使用前初始化局部变量.它们没有默认值.
创建方法时,JVM将完成初始化过程.