如何在Java中分配对象数组?

cpx*_*cpx 0 java arrays

到目前为止,我在阅读一些Java教程时使用以下语法分配数组:

// Ok, all the elements are zero upon creation
int[] a = new int[5];

// I can set all the elements however I want!
for (int i = 0; i < a.length; i++)
     a[i] = i+1
Run Code Online (Sandbox Code Playgroud)

但是自从我开始使用课程以来,事情让我感到困惑:

class Employee
{
    public Employee(String name, int age) {
         emp_name = n;
         emp_age = a;
    }

    void setName(String name) {
          emp_name = name;
    }

    void setAge(int age) {
          emp_age = age;
    }

    private String emp_name;
    private String emp_age;

}
Run Code Online (Sandbox Code Playgroud)

我在main函数中使用此类,如下所示:

Employee[] staff = new Employee[3];
Run Code Online (Sandbox Code Playgroud)

这行应该给我一个三个对象的数组,默认由构造函数初始化.

当我执行以下操作时,我在运行时获得异常.

staff[0].setName("Test");
Run Code Online (Sandbox Code Playgroud)

在C++中,这一直是简单的,不需要额外的new:

Employee *e[3];
Run Code Online (Sandbox Code Playgroud)

因此,在进一步搜索时,有些东西告诉我,我仍然需要为数组中的每个元素分配内存以实际开始使用它们.如果是这样,那么使用new运营商的目的是什么?它是否已经为阵列分配内存?为什么int阵列不会发生这种情况?

Tot*_*Zam 5

创建对象数组时,将创建一个充满null对象的数组.阵列充满了"虚无".一个Employee不会被创建,直到你明确地创建一个.

Employee[] staff = new Employee[3];
Run Code Online (Sandbox Code Playgroud)

此时你的数组看起来像:

[null] [null] [null]

然后,您可以通过执行以下操作来创建Employee:

staff[0] = new Employee();
Run Code Online (Sandbox Code Playgroud)

此时,将调用默认的Employee构造函数,并且您的数组现在具有Employee第一个位置的对象:

[Employee1] [空] [空]

既然你Employee在第一个位置有实际,你应该可以打电话:

staff[0].setName("Test");
Run Code Online (Sandbox Code Playgroud)

更新:

关于这个问题:

使用新运营商的目的是什么?它是否已经为阵列分配内存?为什么int数组不会发生这种情况?

这里这里已经提出类似的问题.简而言之,当您创建对象数组时,您确实创建了一个引用数组.首先,所有这些引用只指向null对象.当你这样做时staff[0] = new Employee();,你实质上做了两件事:

  1. 为"新"员工创建和分配内存
  2. 告诉staff[0]我们现在指向新的Employee对象而不是null