当前位置: 首页 > 知识库问答 >
问题:

如何在Java中分配对象数组?

连正信
2023-03-14

到目前为止,在阅读一些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;

}

我在main函数中使用这个类,如下所示:

Employee[] staff = new Employee[3];

这一行应该给我一个由构造函数默认初始化的三个对象组成的数组。

当我执行以下操作时,运行时会出现异常。

staff[0].setName("Test");

在C语言中,这非常简单,不需要额外的新代码:

Employee *e[3];

所以,在进一步搜索后,我发现我仍然需要为数组中的每个元素分配内存才能真正开始使用它们。如果是这样,那么使用new运算符的目的是什么?它不是已经为数组分配了内存吗?为什么int数组不会发生这种情况?

共有3个答案

谢英耀
2023-03-14

在Java中,创建对象数组时,数组中每个条目的默认值都是null。没有调用构造函数。您必须在数组上循环,并为每个条目创建一个对象。

例如

for(int i=0; i<staff.length; i++){
    staff[i] = new Employee("name" + i, 20);
}
宋斌
2023-03-14

在Java中,所有的对象实际上只是引用(指针,某种程度上)。所以你假设Java自动初始化数组中的值是正确的,但是在你的第二个数组中,你有一个引用数组,它们基本上是内存地址,因此被初始化为null

您得到了异常,因为您正在调用null引用上的方法。此外,请注意,当您创建基元数组时,您正在使用数组中不同索引的赋值操作符。在您的对象示例中,您只是立即使用数组中的值,而不是分配它们。因此,从技术上讲,您在基元数组示例中所做的事情可以通过对象数组来完成,因为它是简单的赋值。

盖弘毅
2023-03-14

创建对象数组时,将创建一个充满对象的数组。数组中充满了“虚无”。除非您明确创建员工,否则不会创建员工。

Employee[] staff = new Employee[3];

此时,您的阵列如下所示:

[null][null][null]

然后,您可以通过以下操作创建员工:

staff[0] = new Employee();

此时,将调用默认的Employee构造函数,您的数组现在在第一个位置有一个Employee对象:

[雇员1][null][null]

现在您在第一个职位上有了一名实际的员工,您应该能够调用:

staff[0].setName("Test");

关于这个问题:

使用新操作符的目的是什么?它是否已经为阵列分配了内存?为什么int数组不会发生这种情况?

这里和这里已经提出了类似的问题。简而言之,创建对象数组时,实际上是创建引用数组。起初,所有这些引用只指向空对象。当您执行staff[0]=新员工()时 ,您实际上在做两件事:

  1. 为“新”员工创建和分配内存
  2. 告诉员工现在指向新员工对象,而不是空

 类似资料:
  • 我已经在这里问了一个问题,但是这个问题只回答了字符串。我不能编辑它,因为那里已经有几个答案了。 现在,我明白了如何用那篇文章中给出的空格分割它。但是,我如何用像这样的自定义类对象分割它: 现在,我想在为false的地方拆分。例如,我有这个数组: 现在,如果将isAdult拆分为false,则如下所示: 那么,如何在java或静态编程语言中实现这一点

  • 问题内容: 我是Java的新手,因此我对对象分配有一些疑问。例如, 假设变量的测试类中定义的,我说得对假设T1和T2点到修改同一个对象会影响和?其实我测试了一下,似乎我是对的。但是,当我尝试相同的操作时,修改仅发生在不影响另一侧的一侧。这是什么原因呢? 编辑:我尝试使用String的情况。 我通过测试String的大小写来意识到我的错误,因为它是不可变的。我认为修改字符串的情况实际上是将对“ 1”

  • 我试图创建一个由子类定义的对象数组(我认为这是正确的术语)。我可以看到这个问题反复出现,但实现仍然存在问题。 我的代码 给出错误 线程“main”java.lang.NullPointerException中出现异常。 为了使其合理化,我将其分解为最简单的术语: 这似乎奏效了。我只是看不出我的两个例子有什么不同。我知道我的第一个没有意义,但是MyClass最终会包含更多的数据。) 我很肯定这个问题

  • 问题内容: 我正在尝试在用户点击操作时将其分配给操作。 我知道如何为a创建动作,但是如何模仿a的相同行为却使用a ? 问题答案: 您需要一个。要进行设置,请使用以下命令: (您也可以使用,并为其分配图片,不添加文字,而只需连接即可)

  • 问题内容: 我想初始化一个BlackJack游戏的Player对象数组。我已经阅读了很多有关初始化原始对象(例如int数组或字符串数​​组)的各种方法的信息,但是我无法将此概念理解为我在此处尝试做的事情(见下文)。我想返回一个初始化的Player对象数组。要创建的播放器对象的数量是一个整数,我向用户提示。我以为构造函数可以接受一个整数值并在初始化Player对象的一些成员变量时相应地命名播放器。我