【问题标题】:How is the memory allocated(stack and heap reference) when an OBJECT array is created?创建 OBJECT 数组时如何分配内存(堆栈和堆引用)?
【发布时间】:2013-10-24 09:09:45
【问题描述】:

喜欢

public static student[] arr = new student[10];

现在,student 是一个包含一些实例变量 name(String)age(int) 的类。 我想知道,一旦这条线被执行,会发生什么? 所有十个引用都会获得内存还是我必须单独分配它们?如果尝试访问student[5].age 会怎样? 我需要知道内存分配状态..谢谢........

【问题讨论】:

标签: java


【解决方案1】:

当执行上述语句时,JVM 将创建 10 个连续的内存位置,每个位置都足够大以保存对 student 的引用。但是,如果您愿意,该数组将不包含任何引用或 null。当您执行像arr[0] = new student(); 这样的语句时,将在堆上创建一个student 对象,并将其引用保存在arr[0] 中。请记住,数组也是在堆上分配的。

因此,一旦您创建了 10 个 student 对象,每个对象都将分配到堆上的某个位置,但它们的引用将存储在 arr

【讨论】:

  • 你的意思是说堆栈不会做任何事情?
  • 在你的情况下没有。只有在使用局部变量(包括参数)时才会使用堆栈。例如你有 String a = new String("abc").现在他们在这里有两件事。变量“a”将在堆栈上创建,但它只会保存对在堆上创建的字符串“abc”的引用。因此,堆中有一个字符串“abc”,其引用保存在堆栈上的局部变量“a”中。
  • 也许这可以解决问题:stackoverflow.com/questions/9991701/…
【解决方案2】:

是的

public static student[] = new student[10];

只要该行执行,JVM 就会为 10 个学生 references 分配内存。

来自official docs on Arrays,看流程。

  // declares an array of integers
        int[] anArray;

        // allocates memory for 10 integers
        anArray = new int[10];

        // initialize first element
        anArray[0] = 100;

【讨论】:

  • 将近一年后的愚蠢问题:在 anArray = new int blah 之后,数组将填充什么,因为原语不能为空?
  • @hintss 2 年后回答。对于原语,它们的数组将使用它们的默认值进行初始化。对象的默认值(如果没有分配任何内容)为空。整数的默认值为 0。
【解决方案3】:

只会创建引用变量,当您创建对象数组时。在您的情况下,学生类的参考变量。

在下图中,创建了一组引用变量。那么你就可以 稍后将这些引用变量指向实际对象。

【讨论】:

【解决方案4】:

public static student[] arr = new student[10]; 将为 10 个学生分配内存。这些内存被空填充。

所以在这里你不能访问student[5].age,因为对实际对象的引用不存在。

我们需要像下面这样单独创建对象引用

 for(int i=0;i<10;i++){
   student[i]= new Student();
 } 

如果您在创建实际对象引用之前访问 student[5].age,您将以 NullPointerException 结束。

【讨论】:

    【解决方案5】:

    所有十个引用都会获得内存还是我必须单独分配?

    您将获得十个参考文献的空间。这些引用将被初始化为null。如果您希望它们设置为 null 以外的任何值,则必须单独进行。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2019-05-17
      • 2011-10-09
      • 2011-05-28
      • 2017-01-04
      • 2012-12-05
      • 2018-09-17
      • 2021-11-18
      相关资源
      最近更新 更多