2012-10-31 54 views
1

为什么空阵列自动初始化内容?

int alone; 
System.out.println(alone); 

给出了错误,但

int[] arr = new int[1]; 
System.out.println(arr[0]); 

等于0? 当您初始化一个空数组时,它是否会自动将其内容初始化为0(或null等)?

回答

6

the language standard

否则,一维阵列被创建指定长度的,并且阵列的每个组件被初始化为默认值(第4.12.5)。

和默认值是:

  • 对于类型字节,默认值是零,即,(字节)的值0。

  • 对于short类型,默认值为零,即(short)的值为0。

  • 对于int类型,默认值是零,即,0

  • 对于类型长,默认值是零,即,0L。

  • 对于浮点类型,默认值为正零,即0.0f。

  • 对于double类型,默认值为正零,即0.0d。

  • 对于char类型,默认值为空字符,即'\ u0000'。

  • 对于布尔类型,默认值为false。

  • 对于所有参考类型(第4.3),缺省值为空。

4

是的,对于原始类型(布尔和字符除外),它将被默认为零。如果对象类型将默认为null

This java tutorial may help you。

注意:当woot4Moo回答时,这仅适用于实例变量。如果局部变量,那么它不会被默认为任何。

+2

不正确,布尔值不初始化为零。 char也不初始化为零。 – Woot4Moo

+0

@ Woot4Moo:同意更新。 – kosa

+0

实例数组变量与本地数组变量没有区别,因为调用'new'时发生此初始化。我不认为'new'有任何区分实例变量和局部变量的方法。 –

2

是的,对于基本类型number arrays,它0初始化,为boolean[],它false初始化,为char[],它NULL(ASCII value 0)初始化和objects [] including String[]null初始化。

+0

@BheshGurung在我纠正的时候,我得到了两个反对票。非常快:) –

+0

和他是不正确的'0'的数字有浮动和双打,得到'0.0' – Woot4Moo

+0

我不明白这个答案投票的原因。 – Jimmy

1

这取决于它在哪里被声明(在函数内部的一个类中)。如果它是一个类成员变量,它将被初始化为默认值。数字类型为0(float类型为0.0/double),字符串为null,布尔值为false,对象为null。如果在函数内声明它,它将在int alone的情况下保持未初始化。就数组而言,它将始终初始化其中包含的值。

+0

downvote porque? – Woot4Moo

+0

请注意,在使用'new'显式初始化数组之后,OP询问数组的*元素*。这与成员变量在声明中获取默认值的问题不同。 –

+0

我还在输入我的评论= p –

2

这里涉及到两个相似的问题。首先请注意,所有变量类型都有一个默认值,这取决于类型。至少有两次使用这些默认值:1)声明一个成员变量,2)用new运算符初始化一个数组。

注意,如果你只是声明一个本地数组变量而不用new进行初始化,那么当你声明一个简单的int变量时,你会得到同样的错误。这是因为所有的局部变量都必须被初始化。他们没有得到一个自动默认值。

另一方面,成员变量确实得到一个默认值。同样,当您使用new运算符创建数组对象时,数组的元素将被初始化为适当的默认值。