我是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],它就创建了四个对象。
是的,它只创建被设置为默认值null的引用。这就是为什么你会得到一个NullPointerException。你需要单独创建对象并分配引用。在Java中创建数组有3个步骤
Declaration – In this step, we specify the data type and the dimensions of the array that we are going to create. But remember, we don't mention the sizes of dimensions yet. They are left empty.
Instantiation – In this step, we create the array, or allocate memory for the array, using the new keyword. It is in this step that we mention the sizes of the array dimensions.
Initialization – The array is always initialized to the data type’s default value. But we can make our own initializations.
Declaring Arrays In Java
This is how we declare a one-dimensional array in Java –
int[] array;
int array[];
Oracle recommends that you use the former syntax for declaring arrays.
Here are some other examples of legal declarations –
// One Dimensional Arrays
int[] intArray; // Good
double[] doubleArray;
// One Dimensional Arrays
byte byteArray[]; // Ugly!
long longArray[];
// Two Dimensional Arrays
int[][] int2DArray; // Good
double[][] double2DArray;
// Two Dimensional Arrays
byte[] byte2DArray[]; // Ugly
long[] long2DArray[];
And these are some examples of illegal declarations –
int[5] intArray; // Don't mention size!
double{} doubleArray; // Square Brackets please!
Instantiation
This is how we “instantiate”, or allocate memory for an array –
int[] array = new int[5];
When the JVM encounters the new keyword, it understands that it must allocate memory for something. And by specifying int[5], we mean that we want an array of ints, of size 5.
So, the JVM creates the memory and assigns the reference of the newly allocated memory to array which a “reference” of type int[]
Initialization
Using a Loop – Using a for loop to initialize elements of an array is the most common way to get the array going. There’s no need to run a for loop if you are going to assign the default value itself, because JVM does it for you.
All in One..! – We can Declare, Instantiate and Initialize our array in one go. Here’s the syntax –
int[] arr = {1, 2, 3, 4, 5};
Here, we don’t mention the size, because JVM can see that we are giving 5 values.
因此,在实例化引用之前,引用始终为空。希望我的回答对你有所帮助!:)
源- Java中的数组
你说得对。除此之外,如果我们想创建一个特定大小的数组,填充一些“工厂”提供的元素,因为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等生成器。
在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;
更多数组创建的可视化示例:
要了解更多关于数组的知识,请查看指南。
假设A类如下:
class A{
int rollno;
int DOB;
}
你想为类a创建一个对象数组,你这样做,
A[] arr = new A[4]; //Statement 1
for (int i = 0; i < 4; i++) {
arr[i] = new A(); //Statement 2
}
这完全正确。
Here A is the class and in Statement 1 Class A is a datatype of the array. When this statement gets executed because of the new keyword an object is created and dynamically memory is allocated to it which will be equal to the space required for the 4 blocks of datatype A i.e, ( for one block in the array space required is 8 bytes (4+4), I am assuming int takes 4 bytes of space. therefore total space allocated is 4*4 bytes for the array ).
Then the reference of the object is given to the arr variable. Here important point to note is that Statement 1 has nothing to do with creating an object for class A ,no object is created for this class it is only used as a datatype which gives the size of the class A required for the memory allocation of the array.
然后,当for循环运行和语句2执行时,JVM现在为类A分配内存(即创建一个对象),并将其引用给arr[i]。每次调用循环时,都会创建一个对象,并将其引用给arr[i]。
因此,拥有8字节空间的arr[0]被赋予a类对象的引用,每次运行time循环都会创建一个新对象,并给予该对象引用,以便它现在可以访问该对象中的数据。