到目前为止,我在阅读一些 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?
类似的问题已经被问过here和 here 。简而言之,当您创建对象数组时,您实际上创建了一个引用数组。起初,所有这些引用都只指向空对象。当您执行 staff[0] = new Employee();
时,您本质上是在做两件事:
- 为"new"员工创建并分配内存
- 告诉
staff[0]
现在指向新的 Employee 对象,而不是null
关于java - 如何在 Java 中分配对象数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31394904/