繁体   English   中英

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

[英]How do I allocate array of objects in Java?

到目前为止,在阅读一些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;

}

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

Employee[] staff = new Employee[3];

这行应该给我一个由三个对象组成的数组,该对象默认由构造函数初始化,就像我假设的那样。

当我执行以下操作时,运行时会出现异常。

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

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

Employee *e[3];

因此,在进一步搜索之后,有一些事情告诉我,我仍然需要为数组中的每个元素分配内存才能真正开始使用它们。 如果是这样,那么使用new运算符的目的是什么? 它不是已经为数组分配了内存吗? int数组怎么会这样呢?

创建对象数组时,将创建一个包含null对象的数组。 该数组充满了“虚无”。 在您显式创建Employee之前,不会创建该Employee

Employee[] staff = new Employee[3];

此时,您的数组如下所示:

[null] [null] [null]

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

staff[0] = new Employee();

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

[Employee1] [null] [null]

现在您已经有一名实际的Employee ,您应该可以致电:

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

更新:

关于这个问题:

使用new运算符的目的是什么? 它不是已经为数组分配了内存吗? int数组怎么会这样呢?

在这里这里已经提出类似的问题。 简而言之,当您创建对象数组时,实际上就是创建了一个引用数组。 首先,所有这些引用仅指向空对象。 当您执行staff[0] = new Employee(); ,您实质上是在做两件事:

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

在Java中,所有“对象”实际上只是引用(指针,某种)。 因此,假设Java自动初始化数组中的值是正确的,但是在第二个数组中,您有一个引用数组,这些引用基本上是内存地址,因此被初始化为null

您正在获取异常,因为您正在对null引用调用方法。 另外,请注意,当您创建原始数组时,您将赋值运算符与数组中的不同索引一起使用。 在带有对象的示例中,您只是立即使用数组中的值,而不分配它们。 因此,从技术上讲,您可以使用对象数组来完成原始数组示例中的操作,因为它是简单的赋值。

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

例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM