我这里有一个关于Java的简单问题。假设您有一个int数组作为实例变量:
int[] in = new int[5];
现在默认情况下,它包含5个零。 但如果你把它作为本地变量使用呢?它会被初始化为0吗?这不是一份作业,我正在学习Java语言。 最好的祝愿。
我这里有一个关于Java的简单问题。假设您有一个int数组作为实例变量:
int[] in = new int[5];
现在默认情况下,它包含5个零。 但如果你把它作为本地变量使用呢?它会被初始化为0吗?这不是一份作业,我正在学习Java语言。 最好的祝愿。
首先要了解的是,局部变量存储在堆栈上,它们没有明确初始化其默认值。而实例变量存储在堆上,并且它们默认情况下会被初始化为它们的默认值。
此外,对象也会在堆上创建,无论是实例引用变量还是本地引用变量持有其引用。
现在,当您像这样声明数组引用作为局部变量并使用数组进行初始化时,会发生什么: -
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"
int[] in = new int[5]
,那么数组将会被初始化为默认值。 - psun如果您这样做:
int[] in = new int[5]
作为实例变量或局部变量,效果是一样的。在两种情况下,数组对象in
将包含零。
唯一的区别是,如果您这样做:
实例变量:int[] in
;(使用null初始化),in
对象将存在于堆空间中。
局部变量:int[] in
;(必须由用户初始化),将存在于栈中。
是的,当你初始化一个数组时,内容将被设置为该类型的默认值,对于 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
public void method() {
int[] in = new int[5];
System.out.pritnln(in[0]); //output in 0
}
当您将其实例化为局部变量时,该数组不包含5个零。