我对以下代码有疑问。

class MemArr{
  int[] mem = {1,2};
}

public class Test{
  public static void main(String[] args){
    MemArr[] x = new MemArr[2];  //line 1
    x[0] = new MemArr();         //line 2
    x[1] = null;                 //line 3
                                 //line 4
  }
}


到达第1行时,总共创建了多少个对象,并且有多少对象可以进行垃圾回收?

我认为,在第1行,创建了5个对象(1个数组x,2个MemArr对象在数组x中,2个整数数组的成员变量用于MemArr对象)

在第2行,创建了两个对象(一个MemArr对象及其成员变量mem)。

在第3行中,当x[1]设置为null时,我认为总共有4个对象适合使用GC,但是对此我不太确定。

最佳答案

MemArr[] x = new MemArr[2];


这将创建一个新的由2个元素组成的MemArr数组,但不会初始化这2个元素中的任何一个。在声明之后,x[0]x[1]都是null:实例化了数组,但没有实例化它的内容。

x[0] = new MemArr();


这实际上为数组的第一个元素分配了一个新的MemArr。因此,它将为其包含的内部MemArr创建一个int[] mem和另一个数组。

x[1] = null;


这条线什么也没做。如前所述,该值已经是null

09-25 21:18