[英]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();
,您实质上是在做两件事:
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.