23

我在这里有一个与 Java 相关的简单问题。假设您有一个 int 数组作为实例变量:

int[] in = new int[5];

因此,现在默认情况下它包含 5 个零。但是,如果您有与局部变量相同的数组怎么办。它是否被初始化为零?那不是家庭作业,我正在学习 Java 语言。最好的祝福

4

7 回答 7

54

首先要了解的是,本地变量存储在堆栈中,这些堆栈没有使用它们的默认值显式初始化。虽然实例变量存储在堆上,并且默认情况下使用它们的默认值进行初始化。

此外,对象也在Heap上创建,无论实例引用变量是持有其引用还是局部引用变量。


现在,发生的情况是,当您将这样的数组引用声明为局部变量并使用数组对其进行初始化时:-

int[] in = new int[5];

数组引用(in)存储在stack上,并为能够在堆上保存5 个整数元素的数组分配内存(请记住,对象是在堆上创建的)。然后,在堆上分配5 个连续的内存位置,用于存储数值。并且数组对象上的每个索引都按顺序保存对这些内存位置的引用。然后数组引用指向该数组。因此,由于在堆上分配了 5 个整数值的内存,它们被初始化为其默认值。(size = 5)

而且,当你声明你的数组引用时,不要用任何数组对象初始化它: -

int[] in;

数组引用是在Stack上创建的(因为它是一个局部变量),但默认情况下它不会初始化为数组,也不会null像实例变量那样初始化。


因此,当您使用数组声明和初始化的第一种方式时,这就是分配的样子:-

"Your array reference"
     "on stack"    

       |    |          "Array object on Heap"
       +----+                  
       | in |---------->  ([0, 0, 0, 0, 0])
       +----+
       "Stack"                  "Heap"
于 2012-11-22T11:36:25.013 回答
5

如果你这样做是一样的:

int[] in = new int[5]作为实例变量或局部变量。在这两种情况下,数组对象in都将包含零。

不同之处在于您是否会执行以下操作:

  1. 实例变量:int[] in; (它用null初始化),并且in对象将存在于堆空间中。

  2. 局部变量:int[] in;(它必须由用户初始化)将存在于堆栈中

于 2012-11-22T11:35:43.437 回答
3

对于原始类型数组,它被初始化为其默认值。在文档中它说:

创建指定长度的一维数组,并将数组的每个组件初始化为其默认值

对于整数类型,默认值为 0。

于 2012-11-22T11:37:46.030 回答
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
于 2012-11-22T11:35:57.937 回答
1

是的

public void method() {
    int[] in = new int[5];
    System.out.pritnln(in[0]); //output in 0
}

在这种情况下,您的Array 是一个局部变量,您所需要的只是初始化您的数组。一旦你初始化了你的数组,你的数组元素**s得到他们的**默认值

于 2012-11-22T11:25:06.123 回答
1

实例变量或局部变量中声明的数组是否会被初始化为默认值并不重要。

每个类变量、实例变量或数组组件在创建时都使用默认值进行初始化。

根据JLS

An array initializer creates an array and provides initial values for all its components.

于 2014-01-05T09:36:05.970 回答
0

当您将其实例化为局部变量时,该数组不包含 5 个零。

于 2012-11-22T11:25:17.107 回答