整型数组的初始化

25

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

int[] in = new int[5];

现在默认情况下,它包含5个零。 但如果你把它作为本地变量使用呢?它会被初始化为0吗?这不是一份作业,我正在学习Java语言。 最好的祝愿。


但我希望有一些讨论让我意识到其中的逻辑,而不仅仅是记住答案。 - uml
@uml 为了更好的理解,请参考 Rohit Jain 的回答 :) - PermGenError
7个回答

56

首先要了解的是,局部变量存储在堆栈上,它们没有明确初始化其默认值。而实例变量存储在上,并且它们默认情况下会被初始化为它们的默认值

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


现在,当您像这样声明数组引用作为局部变量并使用数组进行初始化时,会发生什么: -

int[] in = new int[5];
(in)数组引用存储在堆栈上,并为能够容纳5个整数元素的数组在堆内存上分配了一块内存(记住,对象是在堆上创建的)。然后,在堆内存上为存储整数值的5个连续内存位置(size = 5)分配了空间。数组对象上的每个索引都保存着这些内存位置的引用,以此类推。然后,数组引用指向该数组。因此,由于已在堆上为5个整数值分配了内存,它们被初始化为它们的默认值。

当你声明数组引用时,如果没有将其初始化为任何数组对象:

int[] in;

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


所以,当您使用第一种方式声明和初始化数组时,它看起来是这样的:-

"Your array reference"
     "on stack"    

       |    |          "Array object on Heap"
       +----+                  
       | in |---------->  ([0, 0, 0, 0, 0])
       +----+
       "Stack"                  "Heap"

1
简而言之,如果你这样写:int[] in = new int[5],那么数组将会被初始化为默认值。 - psun
4
每个数组对象上的索引仅仅是相对于数组起始点的偏移量,而不是持有一个对应内存位置的引用。 - shmosel

5

如果您这样做:

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

唯一的区别是,如果您这样做:

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

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


3
对于原始类型数组,它们的初始值为默认值。在文档中说明:

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

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

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

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

在这种情况下,你的数组是一个局部变量,你只需要初始化你的数组。一旦你初始化了你的数组,,你的数组元素会获得它们的默认值

为什么它包含了零?局部变量需要显式地初始化。 - uml
你的数组在这种情况下是局部变量,而不是它的元素。你初始化了你的数组,所以数组中的元素获得它们的默认值 :) - PermGenError

1
无论声明的数组是实例变量还是局部变量,它都会被初始化为默认值。
每个类变量、实例变量或数组组件在创建时都会被初始化为默认值。
根据JLS的规定:
数组初始化程序创建一个数组,并为其所有组件提供初始值。

0

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


那么,它包含什么?垃圾吗? - uml

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接