到目前为止,我在阅读一些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
Run Code Online (Sandbox Code Playgroud)
但是自从我开始使用课程以来,事情让我感到困惑:
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;
}
Run Code Online (Sandbox Code Playgroud)
我在main函数中使用此类,如下所示:
Employee[] staff = new Employee[3];
Run Code Online (Sandbox Code Playgroud)
这行应该给我一个三个对象的数组,默认由构造函数初始化.
当我执行以下操作时,我在运行时获得异常.
staff[0].setName("Test");
Run Code Online (Sandbox Code Playgroud)
在C++中,这一直是简单的,不需要额外的new:
Employee *e[3];
Run Code Online (Sandbox Code Playgroud)
因此,在进一步搜索时,有些东西告诉我,我仍然需要为数组中的每个元素分配内存以实际开始使用它们.如果是这样,那么使用new运营商的目的是什么?它是否已经为阵列分配内存?为什么int阵列不会发生这种情况?
创建对象数组时,将创建一个充满null对象的数组.阵列充满了"虚无".一个Employee不会被创建,直到你明确地创建一个.
Employee[] staff = new Employee[3];
Run Code Online (Sandbox Code Playgroud)
此时你的数组看起来像:
[null] [null] [null]
然后,您可以通过执行以下操作来创建Employee:
staff[0] = new Employee();
Run Code Online (Sandbox Code Playgroud)
此时,将调用默认的Employee构造函数,并且您的数组现在具有Employee第一个位置的对象:
[Employee1] [空] [空]
既然你Employee在第一个位置有实际,你应该可以打电话:
staff[0].setName("Test");
Run Code Online (Sandbox Code Playgroud)
关于这个问题:
使用新运营商的目的是什么?它是否已经为阵列分配内存?为什么int数组不会发生这种情况?
这里和这里已经提出了类似的问题.简而言之,当您创建对象数组时,您确实创建了一个引用数组.首先,所有这些引用只指向null对象.当你这样做时staff[0] = new Employee();,你实质上做了两件事:
staff[0]我们现在指向新的Employee对象而不是null| 归档时间: |
|
| 查看次数: |
9353 次 |
| 最近记录: |