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

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

}

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

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");

更新:

关于问题:

what was the purpose of using new operator? Doesn't it already allocate memory for the array? How come this doesn't happen with int array?

类似的问题已经被问过herehere 。简而言之,当您创建对象数组时,您实际上创建了一个引用数组。起初,所有这些引用都只指向空对象。当您执行 staff[0] = new Employee(); 时,您本质上是在做两件事:

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

关于java - 如何在 Java 中分配对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394904/

相关文章:

java - 正则表达式不喜欢 out#

当我启动一个线程时,Java 游戏一直卡住?

java - UML 类图资源

arrays - 增加指针数组的通用函数

arrays - Bash 移位更改关联数组的期望值

c - 如何在动态内存的情况下处理二维数组,即元素数量在编译时未定义

php - 分解数据库字符串并将值与php中的另一个字符串进行比较

c - c中多维数组的函数传递

java - 使用 Java JNA 调用 DLL 库

java - 如何将信息从 servlet 传递到 JSP 页面