[英]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.