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

时间:2015-07-13 23:00:11

标签: 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

但是当我开始使用课程时,事情让我很困惑:

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;

}

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

Employee[] staff = new Employee[3];

这一行应该给我一个由构造函数初始化的三个对象的数组,如我所假设的那样。

当我执行以下操作时,我在运行时会遇到异常。

staff[0].setName("Test");

在C ++中,这很简单,不需要额外的new

Employee *e[3];

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

3 个答案:

答案 0 :(得分:5)

创建对象数组时,可以创建一个充满JLabel个对象的数组。阵列充满了“虚无”。在您明确创建一个null之前,不会创建Employee

Employee[] staff = new Employee[3];

此时你的数组看起来像:

  

[null] [null] [null]

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

staff[0] = new Employee();

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

  

[Employee1] [空] [空]

现在您在第一个位置有一个实际Employee,您应该可以致电:

staff[0].setName("Test");

更新

关于这个问题:

  

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

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

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

答案 1 :(得分:3)

在Java中,所有&#34;对象&#34;实际上只是引用(指针,类型)。所以你假设Java自动初始化数组中的值是正确的,但是在你的第二个数组中,你有一个引用数组,它们基本上是内存地址,因此被初始化为null

您正在获取异常,因为您正在null引用上调用方法。另外,请注意,在创建基元数组时,您正在使用具有数组中不同索引的赋值运算符。在使用对象的示例中,您只是立即使用数组中的值,而不是分配它们。从技术上讲,你在原始数组示例中所做的事情可以通过对象数组完成,因为它是简单的赋值。

答案 2 :(得分:2)

在Java中,当您创建对象数组时,数组中每个条目的默认值为null。没有被调用的构造函数。您必须遍历数组并为每个条目创建一个对象。

例如

for(int i=0; i<staff.length; i++){
    staff[i] = new Employee("name" + i, 20);
}