簡體   English   中英

如何在Java中分配對象數組?

[英]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(); ,您實質上是在做兩件事:

  1. 為“新”員工創建和分配內存
  2. 告訴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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM