我这里有一个与Java有关的简单问题。 假设你有一个int数组作为实例变量:
int[] in = new int[5];
所以,现在默认它包含5个零。 但是如果你有与本地变量相同的数组呢?它被初始化为零吗?这不是作业,我正在学习Java语言。 最好的问候
答案 0 :(得分:52)
要理解的第一件事是, local varibles 存储在堆栈上,它们没有使用默认值显式初始化。虽然实例变量存储在堆中,但它们默认使用默认值进行初始化。
此外,对象也会在堆上创建,无论实例引用变量是保持其引用还是本地引用变量。
现在,当您将数组引用声明为局部变量并使用数组初始化时,会发生什么: -
int[] in = new int[5];
数组引用(in)
存储在堆栈中,并为能够在堆上保存 5个整数元素的数组分配内存(记住,在Heap上创建对象)。然后,在堆上分配5个连续的内存位置(size = 5)
,用于存储整数值。数组对象上的每个索引按顺序将引用保存到这些内存位置。然后数组引用指向该数组。因此,由于在Heap上分配了5个整数值的内存,因此它们被初始化为默认值。
此外,当您声明数组引用时,并且不使用任何数组对象初始化它: -
int[] in;
数组引用是在 Stack 上创建的(因为它是一个局部变量),但它默认情况下不会被初始化为数组,也不会被null
初始化,因为它是实例变量的情况。
因此,当您使用第一种数组声明和初始化方式时,这就是分配的样子: -
"Your array reference"
"on stack"
| | "Array object on Heap"
+----+
| in |----------> ([0, 0, 0, 0, 0])
+----+
"Stack" "Heap"
答案 1 :(得分:5)
如果你这样做也是一样的:
int[] in = new int[5]
作为实例变量或局部变量。在两种情况下,数组对象in
都将包含零。
如果你做的话会有所不同:
实例变量:int[] in
; (它使用 null 初始化),in
对象将存在于堆空间中。
局部变量:int[] in
; (它必须由用户初始化)将存在于堆栈
答案 2 :(得分:3)
答案 3 :(得分:2)
是的,当你初始化一个数组时,内容将被设置为该类型的默认值,int
它将为0,而对于引用类型,它将是null
。
如果您初始化一个数组并检查内容,您可以自己看到:
...
final int[] in = new int[5];
for (int i = 0; i < in.length; i++) {
System.out.println(in[i]);
}
...
这将打印:
0
0
0
0
0
答案 4 :(得分:1)
是
public void method() {
int[] in = new int[5];
System.out.pritnln(in[0]); //output in 0
}
在这种情况下,数组是一个本地变量,您只需要初始化数组。初始化数组后,瞧您的数组元素**将获得**默认值。
答案 5 :(得分:1)
实例变量或局部变量中声明的数组是否会初始化为默认值并不重要。
每个类变量,实例变量或数组组件在创建时都会使用默认值进行初始化。
根据JLS
An array initializer creates an array and provides initial values for all its components.
答案 6 :(得分:0)
当您将数组实例化为局部变量时,数组不包含5个零。