2014-03-13 28 views
2

我有一个问题:在java中,我们声明int,long,double等,(原始数据) 或非原始数据(对象数据),未用默认值初始化,但在运行 时它将采用默认值。现在我的问题是哪一个分配 默认值:java编译器或Java虚拟机(JVM)?是由编译器或JVM分配的默认字段值吗?

例如:

int x; 
System.out.println(x) //Result is 0; 
+1

JVM执行它 - 默认值在对象创建期间在运行时分配。请参阅[JLS 15.9.4](http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.4):*“新对象包含新实例在指定的类类型及其所有超类中声明的所有字段在创建每个新字段实例时,它将初始化为其默认值。“* –

+0

顺便说一句,您的示例不会编译(假设'x'是本地变量)。 –

+0

雅我知道局部变量需要intilize使用前我得到答案,哪一个分配默认值的数据类型thq所有 – user1990992

回答

5

Java中有三种不同类型的声明变量。它们是实例,类和局部变量。

实例变量

实例变量类的非静态字段,通常简称为域。

  • 原始数字字段初始化为0。这包括byteshortintlongfloatdouble

  • boolean s初始化为false

  • char s初始化为空字符\u0000

  • 引用类型初始化为null

类变量

类变量声明为静态的一类中的一个字段,通常被称为静态变量或静态字段。它也与实例变量初始化相同。

局部变量

局部变量是一种方法,其包括任何方法 参数范围内定义的变量。 局部变量在使用前必须初始化。他们没有默认值。

当创建方法时,初始化过程由JVM完成。

4

为字段的默认值由JVM在运行时分配的。从JLS 15.9.4(重点是我的):

新对象包含在指定的类类型及其所有超类中声明的所有字段的新实例。 创建每个新字段实例时,它都被初始化为默认值。

当然,考虑到这种行为是在JLS规范,编译器可以想见,利用这一点来执行基于未初始化的领域开始与他们的默认值的假设某些优化。

字段被初始化为等于0的任何类型(参考类型为null)。 This article给出了一个很好的列表:

 
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)时,数组元素会自动初始化为默认值。这适用于字段和本地数组变量。