2014-09-24 84 views
0

假设我们有下面的代码:数组局部变量的哪部分存储在堆栈上?哪一部分在堆上?

void method() { 
    int[] test = new int[3]; 
    test[0] = 0; 
    test[1] = 1; 
    test[2] = 2; 
} 

从我从Jon Skeet's post on SO读取时,new int[3]部分相当于:

public class ArrayInt3 { 
    public readonly int length = 3; 
    public int value0; 
    public int value1; 
    public int value2; 
} 

这是否意味着test(以ArrayInt3参考)是堆栈?这是否意味着ArrayInt3在堆上?我想value0,value1value2也在堆上(即在这个例子中是0,1,2)?

所以总共有4个对象在堆上,对吗?

回答

1

堆栈上没有对象。在堆栈中,存储在堆中的单个对象int[]会有参考值。

您必须开始区分对象,变量和值。

局部变量是堆栈中方法堆栈帧的一部分。因此,对int[]的参考值将被存储在堆栈上的变量中。

+0

@SomeRandomGuy这些都不是对象。首先,'ArrayInt3'是一种类型。其余的是价值观。它们是单个'int []'对象的一部分。他们不是独立的。 – 2014-09-24 15:55:07

+0

@SomeRandomGuy如果它们被初始化,它们将是4个参考值,指向堆上的其他4个对象。 – 2014-09-24 15:55:48

+0

@SomeRandomGuy不,堆上有一个对象,即int []对象。 – 2014-09-24 15:56:14