我是Java的新手,在Java中创建了一个对象数组。
我有一个a类的例子
A[] arr = new A[4];
但这只是创建指向A的指针(引用),而不是4个对象。这对吗?我看到,当我试图访问创建的对象中的函数/变量时,我得到一个空指针异常。
为了能够操作/访问对象,我必须这样做:
A[] arr = new A[4];
for (int i = 0; i < 4; i++) {
arr[i] = new A();
}
这是正确的还是我做错了什么?如果这是正确的,那真的很奇怪。
编辑:我觉得这很奇怪,因为在c++中,你只需输入new A[4],它就创建了四个对象。
在java中声明一个新数组的一般形式如下:
type arrayName[] = new type[numberOfElements];
其中type是基本类型或Object。numberOfElements是您将存储到数组中的元素数量,这个值不能更改,因为Java不支持动态数组(如果您需要一个灵活的动态结构来保存对象,您可能需要使用一些Java集合)。
让我们初始化一个数组来存储一个5人的小公司中所有员工的工资:
Int salary [] = new Int [5];
数组的类型(在本例中为int)适用于数组中的所有值。不能在一个数组中混合类型。
现在我们已经初始化了工资数组,我们想要在其中放入一些值。我们可以在初始化过程中这样做:
Int salary [] = {50000, 75340, 110500, 98270, 39400};
或者在以后这样做:
salaries[0] = 50000;
salaries[1] = 75340;
salaries[2] = 110500;
salaries[3] = 98270;
salaries[4] = 39400;
更多数组创建的可视化示例:
要了解更多关于数组的知识,请查看指南。
你说得对。除此之外,如果我们想创建一个特定大小的数组,填充一些“工厂”提供的元素,因为Java 8(引入了流API),我们可以使用下面的一行程序:
A[] a = Stream.generate(() -> new A()).limit(4).toArray(A[]::new);
Stream.generate(() -> new A())类似于以lambda, () -> new A()描述的方式创建的单独A元素的工厂,它是Supplier<A>的实现-它描述了应该如何创建每个新A实例。
Limit(4)设置流将生成的元素数量
toArray(A[]::new)(也可以重写为toArray(size -> new A[size])) -它让我们决定/描述应该返回的数组类型。
对于一些基本类型,你可以使用DoubleStream, IntStream, LongStream,它们还提供了诸如range rangecclosed等生成器。